Fork et synchroniser le référentiel Google Code Subversion dans GitHub


131

Comment puis-je fork et rester synchronisé avec un référentiel Google Code Subversion auquel je n'ai pas d'accès en écriture, dans un référentiel GitHub?

Je souhaite pouvoir développer mes propres fonctionnalités dans mon référentiel Git, mais je souhaite également me synchroniser avec le référentiel Google Code Subversion. Pour récupérer des correctifs du côté du projet Google Code.

Je connais git-svn et je l'ai déjà utilisé pour monter et descendre dans un référentiel Subversion sur lequel j'avais un contrôle total. Mais je ne sais pas comment rester synchronisé avec un référentiel Google Code Subversion.

Réponses:


178

La branche distante de git-svn est à peu près la même qu'une télécommande Git classique. Ainsi, dans votre référentiel local, vous pouvez avoir votre clone git-svn et envoyer les modifications vers GitHub. Git s'en fiche. Si vous créez votre clone git-svn et que vous transférez exactement les mêmes modifications vers GitHub, vous aurez un miroir non officiel du référentiel Google Code. Le reste est à la vanille Git.

git svn clone http://example.googlecode.com/svn -s
git remote add origin git@github.com:example/example.git
git push origin master

Maintenant que vous l'avez, vous devrez parfois synchroniser le référentiel Subversion avec Git. Cela ressemblera à quelque chose comme:

git svn rebase
git push

Dans gitk ou autre, cela ressemblerait à quelque chose comme ceci:

o [master][remotes/trunk][remotes/origin/master]
|
o
|
o

Et quand vous courrez git svn rebase, vous auriez ceci:

o [master][remotes/trunk]
|
o
|
o [remotes/origin/master]
|
o
|
o

Donc, maintenant, l'exécution git pushpousserait ces commits vers GitHub, la branche [remotes / origin / master] là-bas. Et vous reviendriez au scénario du premier diagramme d'art ASCII.

Le problème maintenant est, comment intégrez-vous vos changements dans le mix? L'idée est que vous ne vous engagez jamais sur la même branche que vous êtes git-svn-rebase-ing et git-pushing. Vous avez besoin d'une branche distincte pour vos modifications. Sinon, vous finiriez par rebaser vos modifications par-dessus celles de Subversion, ce qui pourrait déranger quiconque clonerait votre référentiel Git. Suivez-moi? OK, donc vous créez une branche, appelons-la "fonctionnalités". Et vous faites un commit et le poussez sur GitHub dans la branche des fonctionnalités. Votre gitk ressemblerait à ceci:

o [features][remotes/origin/features]
|
o
|
o [master][remotes/trunk][remotes/origin/master]
|
o

Ici, vous avez votre branche de fonctionnalités quelques commits avant la branche Google Code, n'est-ce pas? Alors, que se passe-t-il lorsque vous souhaitez intégrer de nouveaux éléments de Google Code? Vous courriez en git svn rebasepremier et obtiendriez ceci:

                           o [features][remotes/origin/features]
[master][remotes/trunk] o  |
                        |  o
                        o /
                        |/
                        o[remotes/origin/master]
                        |
                        o

Si vous git pushmaîtrisez, vous pouvez imaginer que les [télécommandes / origine / maître] se trouvent au même point que le maître. Mais votre branche de fonctionnalités n'a pas les changements. Vous avez maintenant le choix de fusionner le maître en fonctionnalités ou de rebaser les fonctionnalités. Une fusion ressemblerait à ceci

git checkout features
git merge master 

            o [features]
           /|
          / o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

Ensuite, vous transférez des fonctionnalités sur GitHub. J'ai laissé les télécommandes au maître pour économiser de l'espace, elles seraient au même point que [maître] .

L'approche de rebase est légèrement plus diabolique - vous devrez pousser avec --force car votre poussée ne serait pas une fusion rapide (vous tireriez la branche des fonctionnalités sous quelqu'un qui l'avait clonée). Ce n'est pas vraiment considéré comme acceptable de le faire, mais personne ne peut vous arrêter si vous êtes déterminé. Cela facilite également certaines choses, par exemple lorsque les correctifs sont acceptés en amont sous une forme légèrement retravaillée. Cela vous éviterait d'avoir à vous soucier des conflits, vous pouvez simplement rebaser - ignorer les correctifs en amont. Quoi qu'il en soit, un rebase serait comme ceci:

git rebase master features

         o [features]
         |
         o
         |  o [remotes/origin/features]
[master] o  |
         |  o
         o /
         |/
         o
         |
         o

Et puis vous auriez à git push --forcecela. Vous pouvez voir pourquoi vous devez le forcer, l'historique a un gros schisme ancien entre les [télécommandes / origine / fonctionnalités] et les nouvelles [fonctionnalités] actuelles après le rebase .

Tout cela fonctionne, mais cela demande beaucoup d'efforts. Si vous voulez être un contributeur régulier, le mieux serait de travailler comme ça pendant un certain temps, d'envoyer des correctifs en amont et de voir si vous pouvez obtenir un accès de validation à Subversion. À défaut, ne transmettez peut-être pas vos modifications à GitHub. Gardez-les locaux et essayez quand même de les faire accepter en amont.


Merci pour les excellentes instructions. ( gitnoob ici.) Question rapide. Je l'ai fait contre un grand repo SVN et il est sorti à ~ 141 mégaoctets. Je l'ai poussé sur github, puis je l'ai cloné à nouveau, et il est sorti à 130 mégaoctets. J'ai couru git gcsur les deux. Qu'est-ce qui pourrait expliquer la différence?
mpontillo

... deviner. J'avais besoin git push origin --mirror.
mpontillo

Cela a fonctionné comme un charme, maintenant j'ai juste besoin de dire aux développeurs de googlecode d'origine d'utiliser github avec moi: D
electblake

Cela n'a pas fonctionné pour moi avec l' -soption pour git svn clone, mais sans elle, le reste fonctionnait très bien.
user1027169

15

service svn2github

Le site Web http://svn2github.com/ fournit un service pour transférer tout référentiel SVN accessible au public sur Github (à l' adresse https://github.com/svn2github/projectname ). Je l'ai essayé; en appuyant sur "Créer un miroir", il n'a apparemment rien fait pendant quelques secondes et a affiché le message "erreur", mais cela a fonctionné. Le nouveau référentiel a en fait été créé, contenant le code du repo SVN.

Vous feriez alors un fork du référentiel qu'il crée et travaillez sur votre propre fork. Vous soumettriez ensuite vos modifications au projet en amont en utilisant leur bugtracker.

En regardant les référentiels existants sous l'utilisateur Github du service (par exemple "svn2github poussé vers master à svn2github / haxe il y a 5 heures"), il semble tirer régulièrement des modifications du référentiel SVN. Il n'y a pas d'informations sur qui exécute le service sur le site Web, donc je ne parierais pas qu'il continue à fonctionner indéfiniment, mais cela fonctionne pour le moment (et si jamais il tombe en panne, vous pouvez toujours mettre à jour manuellement votre fork).

Rampe de lancement

Si vous n'êtes pas prêt à utiliser Git et Github, une autre alternative consiste à utiliser Launchpad.net. Launchpad peut importer automatiquement des référentiels SVN (également CVS) dans une branche bzr personnelle. Pour ce faire, créez un projet Launchpad, puis allez sur la nouvelle page d'import , sélectionnez Subversion et entrez l'URL (par exemple http://projectname.googlecode.com/svn/trunk/). Selon la taille du projet, l'importation initiale peut prendre jusqu'à quelques heures. Les importations ultérieures seront effectuées périodiquement.

Pour plus de documentation, voir Importations VCS sur l'aide du Launchpad .


10

Une procédure pas à pas pour la synchronisation de Google Code vers GitHub est disponible sur fnokd.com . L'auteur utilise un serveur distant toujours actif et un travail cron pour automatiser la synchronisation et conserve le tronc SVN dans une branche GitHub appelée «vendeur».


2

GitHub prend désormais en charge l'importation directe de projets subversion (voir http://help.github.com/import-from-subversion/ ). Créez simplement un nouveau dépôt, puis cliquez sur "Importer depuis Subversion" sur l'écran "Étapes suivantes". Cependant, il ne prend pas en charge la synchronisation ultérieure: /.


Cette méthode n'existe plus
magnetik


1

Hmm ... Dans mon entreprise, je faisais à peu près la même chose. Juste avoir les deux repo .svn et .git dans le même répertoire (vous récupérez svn repo et créez git repo dans cette copie de travail).

Ensuite, utiliser svn up et git push a fait l'affaire. Bien sûr, si vous divisez beaucoup, vous devrez fusionner les choses à la main.


Oui, mais je veux éviter d'avoir les métadonnées .svn et j'espérais que git soit capable d'utiliser un dépôt svn en tant que maître en
aval

Alors n'est-il pas possible d'utiliser git-svn pour récupérer le repo et git push vers github?
Marcin Gil

0

Je ne suis pas tout à fait sûr de ce que vous voulez mais, bien sûr, pouvez-vous extraire d'un référentiel subversion et pousser vers un référentiel Git à partir de la même copie de travail. Et vous pouvez également git svn dcommitrevenir au référentiel de subversion. Cependant, vous ne pouvez pas synchroniser le référentiel GitHub avec le référentiel subversion. De plus, lorsque vous avez des commits dans votre copie de travail qui ne sont pas encore dans le référentiel de subversion, vous devrez les rebaser si le référentiel de subversion a été mis à jour, vous obligeant aux git push --force«nouveaux» commits sur GitHub.


0

J'ai trouvé ces instructions sur le blog de Yu-Jie Lin :

Clonez d'abord le référentiel Subversion et poussez vers Git:

git svn clone https://foo.googlecode.com/svn/ git-foo 
cd git-foo
git remote add git-foo git@github.com:username/foo.git 
git push git-foo master

Après avoir validé dans le référentiel Subversion, exécutez

cd /path/to/git-foo
git svn fetch 
git svn rebase 
git push git-foo master
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.