9 votes

Obtenir l'historique complet d'un référentiel SVN qui a été renommé en utilisant git-svn

J'ai un dépôt SVN qui a été renommé de "Projet" à "Projet v1".

J'ai ensuite fait un git svn clone pour créer une version git du dossier SVN renommé.

Quand je fais un git log sur le nouveau dépôt git créé, je ne vois qu'un seul élément d'historique. C'est le message de commit que j'ai donné au dépôt SVN lorsque j'ai renommé le dossier.

Est-il possible que le dépôt git ait tout l'historique SVN antérieur au renommage du dossier (ou à tout autre renommage éventuel précédent)?

12voto

Ben Jackson Points 28358

La seule façon dont j'ai fait cela par le passé (sans savoir si c'est la meilleure ou la seule façon!) était explicitement de git svn fetch l'historique précédent (vous devrez peut-être avoir un deuxième remote pour cela) puis de greffer l'arbre renommé sur l'ancien historique avec git filter-branch (il y a un exemple spécifique dans la documentation pour reparenter un arbre).

Exemple

De : svn://server/repo/project À : svn://server/repo/project_v1

Étape facultative : Si vous n'avez pas encore de dépôt git-svn pour cela, allez-y et faites un git svn clone svn://server/repo/project. La plupart des gens auront probablement déjà ce dépôt car ils ont travaillé avec git-svn tout au long. Si vous n'avez pas encore de dépôt git, vous pouvez faire le clone initial des deux côtés.

Dans votre dépôt git-svn, ajoutez un remote pour le nouveau nom du projet. Je ne pense pas qu'il y ait une commande pour cela, vous ajoutez simplement une section à votre .git/config très similaire à celle qui est déjà là :

[svn-remote "svn_v1"]
        url = svn://server/repo/project_v1
        fetch = :refs/remotes/git-svn-v1

Ce nouveau remote SVN peut être sélectionné avec l'option --remote svn_v1 pour toute commande git-svn. La première chose que vous voudrez faire est git-svn fetch --remote svn_v1 qui va peupler votre dépôt git avec l'historique de cette copie. Comme la question originale le note, cela sera un historique très succinct !

Ensuite, appliquez l'exemple dans la page de manuel de git filter-branch. Vous devrez connaître la pointe de l'ancien historique, qui est git show-ref -s remotes/git-svn (encore une fois, en supposant que votre clone original était l'ancienne version). Ensuite, utilisez git filter-branch --parent-filter 'sed "s/^\$/-p /"' remotes/git-svn-v1 où est le SHA que vous avez obtenu pour la pointe de l'ancien historique.

Vérifiez que cela a fonctionné avec git log remotes/git-svn-v1 et vérifiez tout l'historique.

À ce stade, vous pouvez aller sur votre branche de travail et faire un git reset --hard remotes/git-svn-v1 pour passer cette branche sur le nouvel historique.

Notez que le svn-remote nommé "svn" sera votre valeur par défaut, donc à la fin, vous voudrez renommer les remotes dans les lignes [svn-remote "..."] dans votre .git/config pour que votre principal soit nommé "svn". Vous pouvez nommer l'autre -old ou même le supprimer.

Avertissement : C'est de mémoire et je n'ai pas juste répété ces étapes moi-même. Les commentaires et corrections sont les bienvenus.

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