2009-10-18 7 views
15

Je suis assez nouveau à git et j'essaye de déplacer un dépôt svn vers git. J'ai suivi le guide ci-dessous maintenant j'ai un git sur mon serveur
http://pauldowman.com/2008/07/26/how-to-convert-from-subversion-to-git/Conversion svn en git, comment obtenir les branches ne pas être juste à distance dans le svn repo?

Donc, si je fais « git branch » réponses git « * maître » et si je fais « git branch -r » je reçois un liste de toutes les branches dans le dépôt svn. Mes derniers svn-checkins ont été dans l'une des branches, mais quand j'ai fait le "git svn clone" -stuff mes commits dans cette branche (ils n'ont pas encore été fusionnés dans le tronc) sont visibles dans mon (git) branche maîtresse. Qu'est-ce que j'oublie ici?

Aussi, si je sur mon ordinateur de développement fait "git clone", je récupère les fichiers. Mais si je fais "git branch -r" je ne peux voir que la branche master et non les branches distantes "

Puisque nous nous débarrassons du svn-repo tous ensemble je voudrais avoir toutes les branches svn dans le git-repo pour qu'on puisse y avoir accès depuis les clients développeurs

Encore une fois, je ne suis pas un débutant total, mais pas si loin. .

Mise à jour
Après avoir fait quelques RTFM (homme git-svn) Je résolu le premier problème avec des trucs de branche présent dans la branche master

reset --hard/télécommandes tronc

Maintenant, le tronc et la branche principale sont les mêmes. Maintenant, la prochaine est de comprendre comment obtenir les branches des clients de développement.

Mise à jour 2
Je l'ai travail en combinant l'URL ci-dessus et l'url que Scott a souligné. Donc, depuis le début.

J'ai d'abord créé un référentiel vide sur le serveur, ils sont conservés dans/usr/local/git-repo sur notre serveur:

server> cd /usr/local/git-repos 
server> mkdir my_project.git 
server> cd my_project.git 
server> git init 

Alors je clonée le dépôt svn à mon dev-machine (noter que sur notre serveur svn la « branches » dir est appelée « branche » subjets le « s »):

dev> git svn clone http://<svn.server>/my_project --no-metadata -A authors.txt -t tags -b branch -T trunk my_project 

Puis un peu de nettoyage pour obtenir les étiquettes et les branches dans l'ordre:

dev> cp -Rf .git/refs/remotes/tags/* .git/refs/tags/ 
dev> rm -Rf .git/refs/remotes/tags 
dev> cp -Rf .git/refs/remotes/* .git/refs/heads/ 
dev> rm -Rf .git/refs/remotes 

Maintenant, ajoutez mon serveur comme dépôt distant:

dev> git remote add origin [email protected]<our_server>:/usr/local/git-repos/my_project.git 

Enfin, pousser toutes les branches et les étiquettes sur le serveur:

dev> git push origin --all 

Ouf, maintenant il vous l'avez, maintenant, je peut se débarrasser de ce svn-repo.

Mise à jour 3
Commander ebneters post ci-dessous pour un moyen plus facile de le faire ...

Répondre

14

Il y a une explication assez détaillée sur la façon de faire une assez bonne importation SVN qui explique comment convertir les branches correctement ici:

https://git-scm.com/book/en/v1/Git-and-Other-Systems-Migrating-to-Git

La réponse courte est de lancer ceci:

$ cp -Rf .git/refs/remotes/* .git/refs/heads/ 
$ rm -Rf .git/refs/remotes 

J'espère que c'est utile.

+0

J'ai utilisé cette méthode sur un miroir git d'un serveur svn à partir duquel je continue de chercher, ce qui casse l'histoire. Est-ce prévu ou suis-je en train de faire quelque chose de mal? – Doppelganger

8

Un autre bon moyen de le faire, juste pour l'enregistrement, est d'utiliser svn2git - Je suis en train de convertir plusieurs dépôts assez volumineux et cela a été une aubaine. Il automatise toutes les étapes nécessaires pour prendre soin des branches et convertir les balises svn en vraies balises git.

+0

Ah, cela m'aurait sauvé beaucoup de travail. Mais bon, au moins j'en sais plus sur git maintenant qu'avant ...:) –

5

La solution de Scott n'a pas fonctionné pour moi. Je soupçonne que quelque chose a peut-être changé dans une version récente de git-svn puisqu'il l'a posté (et depuis que le livre lié a été écrit), car il semble agressivement ramasser les ordures dès que le clone est terminé. Mais ce n'est qu'une supposition pour expliquer pourquoi cela n'a pas fonctionné. J'utilise git 1.6.5.6. Plus précisément, mon répertoire .git/refs/remotes était complètement vide à l'exception d'un répertoire de balises, qui était également vide. Il n'y a donc rien que je puisse copier pour bien faire les choses.

Après quelques farfouillé, j'ai pu résoudre ce problème en consultant le fichier .git/refs-emballés et faire la recherche et de remplacement sur les points suivants (dans cet ordre):

refs/remotes/tags => refs/tags 
refs/remotes => refs/heads 

Si votre éditeur est vim, vous pouvez le faire avec ces deux commandes:

:%s/refs\/remotes\/tags/refs\/tags/g 
:%s/refs\/remotes/refs\/heads/g 

svn2git 1.3.1 n'a pas non plus un résultat utilisable pour moi (n'a pas importé de commits après un certain point il y a plusieurs mois, et les branches tout a montré les mêmes commits). Pour l'instant j'ai abandonné svn2git et ai eu le plus de succès en utilisant git-svn combiné avec ce qui précède. Un vœu pieux: ce serait bien si git-svn ajoutait simplement une commande comme 'abandon' ou 'migrer' qui automatiserait ce processus de manière pérenne.

1

J'ai migré 2 svn repos vers git (git version 1.7.0.4) en suivant la recette de Scott, une plus petite et une plus grande. Le plus petit se comportait comme décrit par Scott dans le chapitre du livre. Le plus gros exigeait la solution de David. Une autre chose est que

$ git push origin --all 

ne pas pousser les balises et à la place que je devais faire:

$ git push origin --all 
$ git push origin --tags 

Cela peut ne pas être évident du drapeau --all et du chapitre du livre et je réalisé après avoir supprimé le repit git svn local.

Questions connexes