Est-il possible d'avoir un référentiel Subversion comme sous-module Git?


154

Existe-t-il un moyen d'ajouter un référentiel Subversion en tant que sous-module Git dans mon référentiel Git?

Quelque chose comme:

git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project

https://svn.foo.com/svn/projpointe vers un référentiel Subversion.

Je sais qu'il y en a git-svnqui permet d'interagir avec un référentiel Subversion. Je pense donc qu'il existe peut-être un moyen d'extraire un référentiel Subversion avec git-svnpuis de l'utiliser comme sous-module.

Réponses:


127

Non. Votre meilleur pari serait de mettre en place un miroir du référentiel svn dans un référentiel git dédié.

git svn clone -s http://subversion.example.com/ mysvnclone
cd mysvnclone
git remote add origin git@example.com:project.git
git push origin master

Ensuite, vous pouvez ajouter le référentiel git en tant que sous-module au projet d'origine

cd /path/to/gitproject
git submodule add git://example.com/project.git -- svn-project
git add svn-project
git commit -m "Add submodule"

Il existe une différence conceptuelle entre svn: externals et le sous-module git qui peut vous trébucher si vous abordez cela d'un point de vue subversion. Le sous-module git est lié à la révision que vous lui donnez. Si «en amont» change, vous devez mettre à jour la référence de votre sous-module.

Donc, lorsque nous resynchronisons avec la subversion en amont:

cd /path/to/mysvnclone
git svn rebase
git push

... le projet git utilisera toujours la révision d'origine que nous avons validée précédemment. Pour mettre à jour vers svn HEAD, vous devez utiliser

cd /path/to/gitproject/svn-project
git checkout master
git pull
cd ..
git add svn-project
git commit -m"Update submodule"

1
Avez-vous essayé ces codes avant de les publier ici? les sous-modules ne peuvent pas fonctionner correctement sur git svn.
xhan

4
@xhan oui, et je ne préconise pas de mélanger git-svn et sous-modules dans le même référentiel. Le clone qui utilise git-svn n'est qu'un pont vers la création d'un clone git natif du dépôt svn.
richq

Désolé. Je ne vous ai pas trouvé en utilisant deux dossiers pour faire office de sous-modules. Joli tour.
xhan

Belle technique. N'avez-vous pas besoin d'une étape 'git init --bare' sur le serveur, avant de pousser le repo git-svn là-bas? Je devais faire ça.
Clayton Stanley

Ce n'est probablement pas la valeur par défaut, mais vous pouvez lier svn: externals à une révision spécifique, comme le font les sous-modules git.
MarcH

8

Je viens de traverser ça. Je fais quelque chose de similaire à rq, mais légèrement différent. J'ai configuré l'un de mes serveurs pour héberger ces clones git des dépôts svn dont j'ai besoin. Dans mon cas, je ne veux que des versions en lecture seule et j'ai besoin d'un dépôt nu sur le serveur.

Sur le serveur que je lance:

GIT_DIR=<projectname>.git git init
cd <projectname>.git/
GIT_DIR=. git svn init svn://example.com/trunk
GIT_DIR=. git svn fetch
git gc

Cela configure mon dépôt nu, puis j'ai un script cron pour le mettre à jour:

#!/usr/bin/python

import os, glob

GIT_HOME='/var/www/git'

os.chdir(GIT_HOME)
os.environ['GIT_DIR']='.'
gits = glob.glob('*.git')
for git in gits:
  if not os.path.isdir(git):
    continue
  os.chdir(os.path.join(GIT_HOME, git))
  if not os.path.isdir('svn/git-svn'):
    #Not a git-svn repo
    continue

  #Pull in svn updates
  os.system('git svn fetch && git gc --quiet')
  #fix-svn-refs.sh makes all the svn branches/tags pullable
  os.system('fix-svn-refs.sh')
  #Update the master branch
  os.system('git fetch . +svn/git-svn:master && git gc --quiet')`

Cela nécessite également fix-svn-refs.sh de http://www.shatow.net/fix-svn-refs.sh Cela a été principalement inspiré par: http://gsocblog.jsharpe.net/archives/12

Je ne sais pas pourquoi le git gcest nécessaire ici, mais je n'ai pas pu m'en git pullpasser.

Donc, après tout cela, vous pouvez utiliser le sous-module git en suivant les instructions de rq.


On pourrait penser que vous pouvez même faire cela comme un crochet de validation.
Andres Jaan Tack

6

Actuellement, git-svn ne prend pas en charge svn: externals . Mais il existe deux autres outils qui peuvent vous aider:

  1. SubGit

    SubGit est une solution côté serveur, il permet d'accéder à Git au référentiel Subversion et vice versa. Vous pouvez vous référer à la documentation pour plus de détails, mais en général, il est assez facile d'utiliser SubGit:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    La commande ci-dessus détectera la disposition des branches dans le projet SVN, puis créera un référentiel Git vide, prêt à refléter le projet SVN. Des informations d'identification peuvent vous être demandées à moins qu'elles ne soient déjà stockées dans le cache des informations d'identification SVN dans le répertoire ~ / .subversion. Vous pouvez également ajuster $GIT_REPO/subgit/authors.txtpour mapper les noms d'auteur SVN aux identités Git.

    $ subgit install $GIT_REPO
    $ ... let initial translation complete ... 
    $ TRANSLATION SUCCESSFUL
    

    En ce moment, le référentiel Subversion est connecté au référentiel Git nouvellement créé. SubGit traduit la révision SVN en commit Git à chaque fois svn commitet Git commit en révision SVN à chaque git push.

Tout ce dont vous avez besoin est de rendre le référentiel Git disponible pour les committers. Jetez un œil à git-http-backend pour cela. Ensuite, vous pouvez ajouter le dépôt Git créé en tant que sous-module habituel. SubGit est également disponible en tant que module complémentaire pour le serveur Bitbucket, pour en savoir plus, cliquez ici . Donc, il n'est pas nécessaire d'utiliser des outils externes comme git-svn ou tout autre.

SubGit est un logiciel propriétaire mais il est gratuit pour les petites entreprises (jusqu'à 10 committers), les projets académiques et open source.

  1. SmartGit

    SmartGit remplace git-svn côté client. Vous trouverez ici plus d'informations sur ses fonctionnalités .

    En particulier, SmartGit prend en charge les sous - modules git et svn: externals , vous pouvez les mélanger dans votre référentiel.

    SmartGit est un logiciel propriétaire, mais il est gratuit pour un usage non commercial.


Le subgit( subgit.com/documentation/… ) et le smartgitsupporte le svn:externalsde la même manière par un .gitsvnextmodulesfichier explicite dans une copie de travail. Ce qui signifie que vous devez toujours utiliser ces logiciels pour extraire les externes et que vous ne pouvez pas utiliser l' gitutilitaire de base pour récupérer ces externes directement à partir d'un serveur hub git externe comme githubou gitlab. Ainsi, les sources reliées à un snv:externalsserveur hub git externe ne seront pas observables et téléchargeables sans ces logiciels, ce qui reste un problème important.
Andry

4

En plus de ce que rq a dit, une autre méthode serait d'utiliser le projet tiers "externals" ( http://nopugs.com/ext-tutorial ), qui imite mieux le fonctionnement des références externes svn. Avec les externes, vous pouvez suivre les référentiels git ou svn, et il semble plus facile de pousser vos modifications en amont vers ces dépôts. Cependant, les membres du projet doivent télécharger et installer le package séparé.

Je n'ai pas encore utilisé de sous-modules ou d'externes; cependant, j'ai passé quelques heures à lire sur toutes les alternatives et il semble que les externes conviendront mieux à mes besoins. Il y a une excellente discussion à propos de ces méthodes et d'autres méthodes personnalisées dans le chapitre 15 de «Contrôle de version avec Git», par Jon Loeliger ( http://oreilly.com/catalog/9780596520120 ), que je recommande fortement.


0

Piston est en cours de réécriture pour prendre en charge cela, et l'inverse, plus l'URL Subversion existante dans un répertoire Subvresion et git + git.

Découvrez le référentiel piston Github .

Malheureusement, il ne semble pas avoir été publié.


3
Le piston échouera dans votre visage quand vous en aurez le plus besoin;), donc je ne le recommande pas. De plus, il n'y a plus de correctifs pour le piston.
Henrik

0

Eh bien, il y en a git-remote-testsvn, alors je suppose que quelque chose comme

git submodule add testsvn::http://www.telegraphics.com.au/svn/bzquips/trunk/ \
    module/bzquips

devrait marcher. Le fait-il?

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.