393 votes

Pousser un référentiel git existant vers SVN

J'ai fait tout mon travail dans Git et en le poussant vers GitHub. J'ai été très heureux avec à la fois le logiciel et le site et je n'ai aucune envie de changer mes méthodes de travail à ce stade.

Ma thèse de conseiller est de demander à tous les élèves de poursuivre leur travail dans un référentiel SVN qui est hébergé à l'université. J'ai trouvé des tonnes de documentation et des tutoriels à propos de tirer vers le bas d'un existant repo SVN vers git, mais rien de pousser un repo git d'une nouvelle repo SVN. Je m'attends il y a un moyen de le faire avec une combinaison de git-svn et une branche frais et complet et tous ces merveilleux termes, mais je suis un git débutant et ne se sentent pas à l'aise avec l'un d'eux.

Je veux juste un couple de commandes pour pousser s'engage à qui repo SVN lorsque je choisis, je souhaite continuer à utiliser Git et SVN pensions de miroir de ce qui est dans le dépôt Git.

Je vais être la seule personne s'engageant à SVN, si cela fait une différence.

Les instructions sur comment faire ce serait très apprécié!

408voto

troelskn Points 51966

J'avais besoin de ce ainsi, et avec l'aide de la Bombe de réponse + certains de bidouiller, j'ai eu de travail. Voici la recette:

Importation git -> svn

1. cd /path/to/git/localrepo
2. svn mkdir --parents protocol:///path/to/repo/PROJECT/trunk -m "Importing git repo"
3. git svn init protocol:///path/to/repo/PROJECT -s
4. git svn fetch
5. git rebase trunk
5.1.  git status
5.2.  git add (conflicted-files)
5.3.  git rebase --continue
5.4.  (repeat 5.1.)
6. git svn dcommit

Après #3, vous obtiendrez un message cryptique comme ceci:

À l'aide de plus haut niveau de l'URL: protocol:///path/to/repo/PROJECT => protocol:///path/to/repo

Il suffit de les ignorer.

Lorsque vous exécutez #5, vous pourriez obtenir des conflits. Résoudre ces par l'ajout de fichiers avec l'état "dissociées" et la reprise de rebase. Finalement, vous serez fait; Puis de synchroniser jusqu'à la svn-repo, à l'aide de dcommit. C'est tout.

Maintien de repos dans la synchro

Vous pouvez désormais synchroniser à partir de svn -> git, en utilisant les commandes suivantes:

git svn fetch
git rebase trunk

Et pour la synchronisation à partir de git -> svn, utilisez:

git svn dcommit

Note finale

Vous voudrez peut-être essayer cela sur une copie locale, avant d'appliquer pour un live repo. Vous pouvez faire une copie de votre git-repo à un lieu temporaire, simplement à l'aide d' cp -r,, toutes les données sont dans l'opération elle-même. Vous pourrez alors mettre en place un fichier de test basée sur les pensions, à l'aide de:

svnadmin create /home/name/tmp/test-repo

Et vérifier une copie de travail, en utilisant:

svn co file:///home/name/tmp/test-repo svn-working-copy

Qui vous permet de jouer avec des choses avant de faire des changements durables.

Addendum: Si vous vous trompez git svn init

Si vous exécutez accidentellement git svn init avec l'url erronée, et que vous n'étiez pas assez intelligents pour faire une sauvegarde de votre travail (ne me demandez pas ...), vous ne pouvez pas exécuter la même commande à nouveau. Vous pouvez toutefois annuler les modifications apportées par l'émission de:

rm -rf .git/svn
edit .git/config

Et supprimer la section [svn-remote "svn"] section.

Vous pouvez ensuite exécuter git svn init de nouveau.

34voto

Alex Rouillard Points 515

Voici comment nous avons fait ce travail :

Cloner votre repo git somwhere sur votre machine. Ouvert .git/config et ajouter les éléments suivants(à partir de http://www.kerrybuckley.org/2009/10/06/maintaining-a-read-only-svn-mirror-of-a-git-repository/):

[svn-remote "svn"]
    url = https://your.svn.repo
    fetch = :refs/remotes/git-svn

maintenant, à partir d'une fenêtre de console, tapez :

git svn fetch svn
git checkout -b svn git-svn
git merge master

Maintenant, si ça casse ici pour quelque raison que ce soit, le type de ces 3 lignes :

git checkout --theirs .
git add .
git commit -m "some message"

et enfin, vous pouvez vous engager à svn

git svn dcommit

note: j'ai toujours rejets de dossier par la suite.

cheers !

9voto

Bombe Points 34185

Créez un nouveau répertoire dans le dépôt subversion pour votre projet.

Mettre en place votre projet géré par Git et initialiser git-svn.

Cela va créer une validation unique parce que votre répertoire de projet svn est toujours vide. Maintenant tout rebase sur ce commit, `` et vous devriez être fait. Il sérieusement gâchera vos dates de validation, cependant.

3voto

Casey Points 19286

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X