Est-il possible d’avoir un repository Subversion en tant que sous-module Git?

Est-il possible d’append un repository 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/proj pointe vers un repository Subversion.

Je sais qu’il existe git-svn qui permet d’interagir avec un repository Subversion. Donc, je pense, peut-être il y a un moyen d’extraire un repository Subversion avec git-svn et ensuite l’utiliser comme un sous-module.

Votre meilleur pari serait de mettre en place un miroir du repository svn dans un repository git dédié.

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

Ensuite, vous pouvez append 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 le sous-module svn: externals et le sous-module git qui peut vous faire trébucher si vous vous en approchez d’un sharepoint vue subversif. Le sous-module git est lié à la révision que vous lui donnez. Si “en amont” change, vous devez alors 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 originale que nous avons validée précédemment. Pour mettre à jour le svn HEAD, vous devrez utiliser

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

Je suis juste passé par là. 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 svn repos dont j’ai besoin. Dans mon cas, je ne veux que des versions en lecture seule, et j’ai besoin d’un repository sur le serveur.

Sur le serveur que je lance:

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

Cela configure mon repo 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 twigs/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 suis pas sûr de savoir pourquoi le git gc est nécessaire ici, mais je n’ai pas pu faire de git pull sans cela.

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

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

  1. SubGit

    SubGit est une solution côté serveur, il permet un access Git au repository 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 twigs dans le projet SVN, puis créera un référentiel Git vide prêt à refléter un projet SVN. On peut vous demander des informations d’identification à moins que celles-ci 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.txt pour $GIT_REPO/subgit/authors.txt noms d’auteur SVN aux identités Git.

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

    À ce moment, vous avez un repository Subversion connecté au repository Git nouvellement créé. SubGit traduit la révision SVN en Git commit sur chaque svn commit et Git valide dans la révision SVN à chaque fois que git push .

Tout ce dont vous avez besoin est de rendre le repository Git disponible pour les committers. Jetez un oeil à git-http-backend pour cela. Ensuite, vous pouvez append un référentiel Git créé en tant que sous-module habituel. SubGit est également disponible en complément du serveur Bitbucket, pour en savoir plus. Il n’est donc pas nécessaire d’utiliser des outils externes tels que git-svn ou autre.

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

  1. SmartGit

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

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

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

En plus de ce que dit rq, une autre méthode consisterait à utiliser le projet “externals” tiers ( 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 est plus facile de transférer vos modifications en amont vers ces repos. 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’extérieurs; Cependant, j’ai passé quelques heures à lire toutes les alternatives et il semblerait 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 “Version Control with Git”, par Jon Loeliger ( http://oreilly.com/catalog/9780596520120 ), que je recommande fortement.

Piston est en cours de réécriture pour prendre en charge ceci et l’inverse, ainsi que l’URL Subversion existante dans un repoistory Subvresion et git + git.

Découvrez le repository Github à piston .

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

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

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

devrait marcher. Est-ce que ça?