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 [email protected]: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 push
pousserait 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 rebase
premier et obtiendriez ceci:
o [features][remotes/origin/features]
[master][remotes/trunk] o |
| o
o /
|/
o[remotes/origin/master]
|
o
Si vous git push
maî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 --force
cela. 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.
git
noob 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 courugit gc
sur les deux. Qu'est-ce qui pourrait expliquer la différence?git push origin --mirror
.-s
option pourgit svn clone
, mais sans elle, le reste fonctionnait très bien.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 .
la source
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».
la source
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: /.
la source
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.
la source
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 dcommit
revenir 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 auxgit push --force
«nouveaux» commits sur GitHub.la source
J'ai trouvé ces instructions sur le blog de Yu-Jie Lin :
Clonez d'abord le référentiel Subversion et poussez vers Git:
Après avoir validé dans le référentiel Subversion, exécutez
la source