web-dev-qa-db-fra.com

Comment migrer du code de SVN vers GIT sans perdre l'historique des validations?

Je voudrais connaître la façon recommandée de déplacer notre code d'un référentiel SVN vers un référentiel GIT, afin que nous fassions la transition de notre équipe de développeurs et que nous commencions à utiliser GIT.

Pouvons-nous faire la transition et conserver toutes les validations effectuées dans le référentiel SVN?

De plus, notre équipe est actuellement satisfaite de SVN, mais ils ne savent pas que la branche dans GIT est beaucoup plus facile que SVN, où puis-je trouver un exemple pratique qui prouve la puissance de GIT dans la branche?

71
simo

Eric Raymond (esr) a créé reposurgeon , "un interpréteur de commandes pour effectuer des opérations d'édition délicates sur les historiques de contrôle de version". L'outil comprend des scripts à des fins diverses, y compris le nettoyage des résultats des conversions VCS. Découvrez-le sur https://gitlab.com/esr/reposurgeon .

Depuis la version 2.0, il inclut la prise en charge de la lecture des fichiers de vidage SVN pour une traduction complète et idiomatique vers Git, Mercurial, , etc. ; voir http://esr.ibiblio.org/?p=4071 pour plus de détails. Reposurgeon a été utilisé pour convertir plusieurs grands projets en Git, y compris Emacs dont le référentiel, ESR dit, "est grand, complexe dans la structure de la branche, et assez vieux pour avoir commencé sa vie en tant que dépôt CVS. Cette dernière partie est importante car certains des problèmes de traduction les plus laids qui se cachent dans le passé des projets Subversion sont d'étranges séquences d'opérations Subversion (y compris des combinaisons d'opérations de copie de branche) générées par cvs2svn.

(L'outil git-svn inclus avec Git gère de nombreux référentiels Subversion, y compris les branches. Il est assez couramment utilisé, en particulier par les équipes qui sont en train de faire une conversion, car il permet à Git de se comporter comme un client Subversion. Mais voir les ESR Ne faites pas de conversions de référentiel svn-to-git avec git-svn! , où il discute des inconvénients de git- svn comme outil de conversion.)

En ce qui concerne votre deuxième question, elle ne se ramifie pas là où le pouvoir de Git est si utile (bien que Git soit au moins aussi puissant que Subversion à cet égard); c'est quand il s'agit de fusionner ces branches que Git brille. Lisez le Git Community Book , en particulier la section du chapitre 3 intitulée " Basic Branching and Merging " et la section du chapitre 7 intitulée " Advanced Merging = ".

48
J. C. Salomon

Puisqu'il y a déjà beaucoup de gens qui travaillent avec git-svn , je dirais que c'est tout à fait possible. La commande suivante est assez bien connue:

git svn clone -s http://svn/repo

Selon le manuel (vérifié localement), cela conservera le "tronc, les balises et les branches".

19
l0b0

Mise à jour avril 2014

Il existe un outil appelé Svn2Git qui fait un très bon travail pour rendre ce processus un peu plus facile. La documentation sur le projet Github est assez bonne. ( Ruby requis )

Il convient de noter que, bien que git-svn utilise par défaut uniquement le chemin que vous spécifiez, pas les branches, les balises et le tronc. Svn2git est le contraire. Par défaut, il recherchera un tronc, des branches et des balises sous le chemin d'accès et vous devez utiliser --nobranches ou --notags pour lui dire de ne pas les rechercher (bien que cela puisse annuler les avantages de svn2git).


Une fois que vous passez à Git, je vous suggère de déplacer tout le monde et de continuer à utiliser Git. C'est plus compliqué mais la transition en vaudra la peine. Github.com prend en charge l'accès au référentiel à l'aide d'un client Subversion (mais vous risquez de perdre le pouvoir de la branche Git) et cela pourrait être un bon intervalle.

Puis-je conserver mon dépôt Subversion?

Lorsque vous utilisez la méthode ci-dessous pour vous déplacer, toutes les validations actuelles resteront dans le dépôt Subversion. Vous pouvez peut-être effectuer une synchronisation unidirectionnelle du dépôt Subversion vers le dépôt Git, mais aller dans l'autre sens devient très compliqué très rapidement. Je ne recommanderais pas d'essayer de synchroniser de toute façon et de déplacer tout le monde une seule fois.

Qu'est-ce qui est puissant avec Git?

La ramification Git est puissante mais ce n'est pas tout ce qu'il y a à Git. Avoir un historique complet localement signifie que vous pouvez faire tout ce que vous pouvez faire avec Subversion, mais sans avoir à contacter le serveur. La révision et la recherche de l'historique, l'annulation des modifications, la validation locale, la ramification locale deviennent extrêmement rapides. Git compresse également ses données, donc une extraction Subversion (qui ne comprend que la dernière révision) finit par avoir à peu près la même taille qu'une extraction Git (qui inclut l'historique complet). De plus, comme les données sont compressées lors du transfert, les poussées et les tirages sont également beaucoup plus rapides. Ne vous contentez pas de pousser les branches Git, mettez tout sur Git.

Comment déplacer un référentiel en utilisant le git svn méthode.

Tout d'abord, clonez le dépôt Subversion. Cela peut prendre un certain temps.

git svn clone http://www.example.com/svn-repo/projectA/trunk/

http://www.example.com/svn-repo/ est l'URL du dépôt Subversion et projectA/trunk/ est le chemin que vous souhaitez copier dans Git.

Si vous avez une disposition standard telle que projectA/trunk, projectA/branches/ et projectA/tags/ que vous pouvez ajouter --stdlayout et clone à partir d'un répertoire comme celui-ci

git svn clone --stdlayout http://www.example.com/svn-repo/projectA/  projectA.git-svn

Et, si vous avez un dossier trunk, branches et tags nommé différemment puis ci-dessus, vous donnez un git svn clone noms personnalisés pour chacun.

git svn clone --trunk my-trunk --branches my-branches --tags my-tags http://www.example.com/svn-repo/projectA/  projectA.git-svn

Une fois cela terminé, tout ce que vous avez à faire est de pousser vers le dépôt git distant avec --mirror.

cd projectA.git-svn
git Push --mirror [email protected]:Account/projectA.git

À ce stade, vous devez rendre votre dépôt Subversion en lecture seule pour empêcher les gens d'essayer de s'engager dans un emplacement obsolète.

11
Nate

Le dépôt peut être entièrement converti, y compris les balises et toutes les branches à l'aide de git svn clone.

Il y a quelques ajustements nécessaires pour obtenir les balises correctes, voir ce lien pour plus d'informations.

Ce sujet a été traité ici à SO au moins une fois avant:
Comment importer des branches et balises svn dans git-svn?

5
eckes

L'approche de migration sûre et fluide de Svn vers Git consiste à utiliser SubGit - outil de synchronisation Git/Svn côté serveur. On peut installer SubGit dans le référentiel Subversion et continuer à utiliser simultanément Subversion et Git tant que le processus de migration dure.

Avertissement: je suis un développeur SubGit qui utilise déjà SubGit avec plaisir depuis six mois.

2
Alexander Kitaev

John Albin a écrit de bons scripts ici et ici qui feront toute la conversion pour vous (y compris la conversion d'auteur). Les scripts ne sont pas parfaits (j'ai eu quelques hickups avec plusieurs branches et surtout avec des externes svn).

Atlassian a en fait écrit un guide sur la migration svn vers git (et ils ont aussi de bons tutoriels sur ces pages).

git est très puissant mais il y a une mise en garde: jusqu'à présent, git n'a rien de plus simple que svn: externals. Il existe des alternatives (sous-arbre git et sous-modules git) mais elles ne fonctionnent jamais aussi intuitivement que les externes svn (mais c'est pour une autre question: regardez autour de stackoverflow, vous trouverez de nombreuses questions liées à ce sujet)

1
Chris Maes

J'ai migré notre dépôt CVS il y a quelque temps vers git, en convertissant d'abord en Subversion puis en git. Cela a bien fonctionné lors de l'utilisation de l'outillage approprié.

Voir Le moyen le plus robuste pour convertir un référentiel CVS contenant des projets Eclipse en git?

Aussi, une fois terminé, testez rigoureusement.

En ce qui concerne la ramification git, ce n'est pas la partie intelligente. L'avantage se présente lorsque vous devez fusionner branches.

1