2016-07-15 6 views
1

Il existe un projet sur GitHub depuis un certain temps, mais auparavant, il était migré à partir de svn. Lors de sa migration initiale, l'historique SVN n'a pas été transmis à Git. Existe-t-il un moyen de copier/importer/cloner/déplacer l'historique SVN vers Git après la configuration du projet?Importation de l'historique dans un projet Git existant à partir de SVN

+0

Vous pouvez créer un nouveau clone basé sur l'historique Subversion, puis essayer de fusionner ces modifications dans votre référentiel Git existant. Notez que vous ne serez pas en mesure d'introduire cet historique Subversion comme base pour l'historique Git existant, mais vous pourriez l'avoir comme un historique parallèle que vous allez fusionner maintenant. – poke

+0

@poke pourquoi ne devrait-il pas pouvoir? Bien sûr qu'il est. Bien sûr, il va réécrire l'histoire publiée avec ceci et n'importe qui utilisant le repo doit récupérer en rebasant toutes ses branches manuellement comme toujours avec l'histoire publiée changée. – Vampire

+0

@Vampire Il ne peut pas sans réécrire l'histoire, c'est ce que je voulais dire. Si le projet a été actif pendant un certain temps, il semble que ce soit une bonne idée de garder l'historique tel quel. – poke

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.


Après avoir converti votre repo SVN à un git approprié, ajoutez votre repo nouvellement généré comme télécommande pour votre prise en pension et aller chercher les commits existants. Utilisez ensuite git replace pour remplacer la première validation de votre nouvel historique par la dernière validation de votre ancien historique. Si vous voulez rendre ceci permanent, vous pouvez alors utiliser git filter-branch pour rendre le remplacement permanent. Sachez que vous allez réécrire l'historique publié et que tout le monde ayant des branches locales basées sur l'ancien historique devra récupérer de cette modification d'historique comme décrit dans la documentation de git rebase. Si vous ne le souhaitez pas, vous pouvez simplement insérer le repo nouvellement migré dans votre dépôt Git et créer simplement de nouvelles branches à partir de l'historique SVN.Vous aurez alors plusieurs validations racine et des historiques indépendants, ce qui est techniquement correct, mais vous aurez toujours une coupe dans l'histoire des fichiers.

1

Cela est possible mais vous aurez un impact sur tous les utilisateurs qui ont déjà cloné le référentiel. Donc, vous devez d'abord décider si cela en vaut la peine.

Dans le cas contraire, le clone juste avec git-svn dans un autre dépôt git et le garder là pour l'histoire du code source ...

Si vous voulez aller plus loin, une fois que l'histoire est récupéré, ajoutez ce nouveau référentiel en tant que distant dans votre dépôt réel et récupérer.

git fetch --all 

Une fois cela fait, vous devriez avoir un historique disjoint. Ensuite, utilisez 'git replace' pour remplacer la première validation du nouveau dépôt par la dernière de la branche que vous venez de récupérer.

https://git-scm.com/docs/git-replace

Enfin, utilisez git filtre branche ', qui réécrire l'histoire sans aucun doute.

Vous devrez pousser la nouvelle histoire, avec quelque chose comme:

git push origin --all 

Et tous les autres développeurs devront cloner ou aller chercher toute l'histoire ... Et se plaindra ;-)

+0

Merci pour le conseil. Actuellement, il n'y a que quelques clones du repo, donc c'est sous contrôle ... Je prévois de faire quelque chose de similaire. Mon idée est de convertir le svn en un git, puis fusionner ce repo comme une branche du repo existant, puis rebaser le maître du repo existant. Pensez-vous que cela fonctionnera? – mattsun

+0

En esprit, les 2 solutions sont les mêmes (sauf si en 'fusionnant' vous ne dites pas 'aller chercher', comme je le décris, sinon vous allez directement en enfer ... :() mais le mien est plus facile. ... – Philippe