Est-il possible 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
Où https://svn.foo.com/svn/proj
pointe vers un référentiel Subversion.
Je sais qu'il existe git-svn
qui permet d'interagir avec un référentiel Subversion. Je pense donc qu'il existe peut-être un moyen d'extraire un dépôt Subversion avec git-svn
et de l'utiliser ensuite comme sous-module.
Votre meilleur choix serait de configurer 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 [email protected]: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 faire trébucher si vous vous en approchez du point de vue de Subversion. Le sous-module git est indexé sur la révision que vous lui donnez. Si "en amont" change, vous devez alors mettre à jour la référence de votre sous-module.
Alors, quand nous resynchronisons avec la version amont Subversion:
cd /path/to/mysvnclone
git svn rebase
git Push
... le projet git utilisera toujours la révision originale que nous avons engagée précédemment. Pour mettre à jour 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"
Je viens de traverser cela. Je fais quelque chose de similaire à rq, mais légèrement différent ..__ J'ai installé l'un de mes serveurs pour héberger ces clones git du svn repos dont j'ai besoin. Dans mon cas, je ne veux que des versions en lecture seule et j'ai besoin d'un référentiel nu sur le serveur.
Sur le serveur 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
Ceci configure mon rapport 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 gc
est nécessaire ici, mais je n’ai pas pu faire un git pull
sans ce dernier.
Donc, après tout cela, vous pouvez utiliser git submodule en suivant les instructions de rq.
Actuellement, git-svn ne prend pas en charge svn: externals. Mais il existe deux autres outils pouvant vous aider:
SubGit est une solution côté serveur, elle permet à Git d'accéder au référentiel Subversion et inversement. Vous pouvez vous référer à documenation 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 vide Git vide, prêt à refléter le projet SVN. Des informations d'identification peuvent vous être demandées, à 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 mapper les noms d’auteurs SVN sur les identités Git.
$ subgit install $GIT_REPO
$ ... let initial translation complete ...
$ TRANSLATION SUCCESSFUL
À ce moment, le référentiel Subversion est connecté au référentiel Git récemment créé. SubGit traduit la révision SVN en validation Git à chaque svn commit
et la validation Git en révision SVN à chaque git Push
.
Tout ce dont vous avez besoin est de rendre le référentiel Git disponible pour les auteurs. Jetez un coup d'œil à git-http-backend pour cela. Ensuite, vous pouvez ajouter le référentiel Git créé en tant que sous-module habituel. SubGit est également disponible en tant qu’add-on pour le serveur Bitbucket, pour en savoir plus, consultez ici . Il n’est donc pas nécessaire d’utiliser des outils externes tels que git-svn ou d’autres.
SubGit est un logiciel propriétaire, mais il est gratuit pour les petites entreprises (jusqu’à 10 personnes), les projets académiques et les projets à code source ouvert.
SmartGit remplace git-svn côté client. Vous trouverez plus d’informations sur ses fonctionnalités ici .
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 une utilisation non commerciale.
En plus de ce que rq a dit, 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 de svn. Avec externals, vous pouvez suivre les dépôts git ou svn, et il semble plus facile de reporter vos modifications en amont vers ces dépôts. Toutefois, 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'externals; Cependant, j'ai passé quelques heures à lire toutes les alternatives et il semble que les solutions externes seront mieux adaptées à mes besoins. Il existe une excellente discussion sur ces méthodes et d’autres méthodes personnalisées au chapitre 15 de "Contrôle de version avec Git" de Jon Loeliger ( http://oreilly.com/catalog/9780596520120 ), que je recommande vivement.
Piston est en cours de réécriture pour prendre en charge ceci, et l’inverse, ainsi que l’URL Subversion existante dans un répertoire Subvresion et git + git.
Consultez le référentiel de piston Github .
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. Le fait-il?