2016-08-24 1 views
0

J'importe actuellement un référentiel SVN dans Git. La structure du référentiel SVN est un peu compliquée, je dois donc le convertir en trois dépôts Git distincts, puis les fusionner tous ensemble.Introduire des fusions dans l'historique Git greffé

Si ceux-ci était un projet simple avec trois parties à une seule histoire, alors je pourrais juste les rebasage au-dessus de l'autre, par exemple:

cd part3 
git remote add -f part1 url_to_part1 
git remote add -f part2 url_to_part2 
git rebase part2/master 
git rebase part1/master 

Cependant part3 dans mon exemple ci-dessus contient des dizaines de balises et trois branches. Si les parties 1 et 2 avaient été fusionnées proprement en master (puits, tronc) dans SVN, alors je ferais quelque chose comme this pour greffer correctement la branche dans l'historique. Cela a l'avantage que tous les tags restent en place, contrairement à un rebase.

Mais l'une des branches a un commit orphelin que nous aimerions fusionner dans l'historique. Maintenant, si j'essaie de réparer l'historique avec le greffon, les modifications de la validation orpheline sont perdues. Dans l'exemple ci-dessous, la fusion de X à C s'est produite dans SVN et je peux donc créer le lien avec un greffon. Mais je veux fusionner les orphelins à cause de commettre O entre C et D, tout en préservant les balises sur commits E, G, etc.

A-B-C-[ ]-D-E-F-G-H-... 
\// 
    X--O 

Est-il possible que je peux préciser la structure graphique en utilisant quelque chose comme fichier les greffes mais alors effectivement exécuter les fusions implicites? Ou y a-t-il une commande filter-branch que je devrais utiliser ici?

+0

La [note sur cette question] (http://stackoverflow.com/questions/3810348/setting-git-parent-pointer-to-a-different-parent/3811028#3811028) suggère que cela n'est pas possible avec greffes. Je suppose que je vais devoir rebaser puis déplacer manuellement les tags. – jkeirstead

Répondre

1

git-svn est pas le bon outil pour les conversions ponctuelles de référentiels. C'est un excellent outil si vous voulez utiliser Git comme frontal pour un serveur SVN existant, mais pour les conversions uniques, pas utilisez git-svn, mais svn2git, ce qui est beaucoup plus adapté à cette utilisation.

Il existe des outils pleny appelés svn2git, le meilleur est probablement le KDE de https://github.com/svn-all-fast-export/svn2git. Je recommande fortement d'utiliser cet outil svn2git. C'est le meilleur que je connaisse et il est très flexible dans ce que vous pouvez faire avec ses fichiers de règles.

Si vous n'êtes pas à 100% sur l'historique de votre dépôt, svneverever de http://blog.hartwork.org/?p=763 est un excellent outil pour étudier l'historique d'un référentiel SVN lors de sa migration vers Git.

Vous serez en mesure d'écrire le fichier de règles de manière à pouvoir convertir votre référentiel SVN entier en une exécution très performante dans un référentiel Git approprié.

+0

Pour clarifier, j'utilise svn2git avec trois ensembles de paramètres différents pour un référentiel SVN, puis j'essaie d'assembler les résultats ensemble (parce qu'une seule commande svn2git ne correspond pas à la disposition non-standard du repo SVN). – jkeirstead

+0

Pour clarifier, vous ** n'utilisez pas ** l'utilitaire svn2git que j'ai recommandé, sinon vous n'auriez pas à sauter des cerceaux comme vous essayez de le faire. ;-) – Vampire