829 votes

Est-il possible de déplacer/renommer des fichiers dans git et de maintenir leur histoire?

Je voudrais renommer/déplacer un projet de sous-arborescence dans Git en le déplaçant d'

/project/xyz

pour

/components/xyz

Si j'utilise un simple git mv project components alors tous les fichiers de l'histoire de l' xyz project est perdu.

Est-il un moyen de déplacer ce tels que l'histoire est maintenue?

744voto

Troels Thomsen Points 4839

Git détecte renomme plutôt que de la persistance de l'opération avec la révision, donc, si vous utilisez git mv ou juste un simple mv n'a pas d'importance.

Le journal de commande, cependant, prend un --follow argument qui continue l'histoire avant une opération de changement de nom (qui est, il recherche pour un contenu similaire à l'aide de l'heuristique):

http://git-scm.com/docs/git-log

La consultation de l'historique de l'utilisation de la commande suivante:

git log --follow ./path/to/file

122voto

Øystein Steimler Points 489

Il est possible de renommer un fichier et de conserver l'historique intact, bien qu'il provoque le fichier sera renommé au long de toute l'histoire du référentiel. C'est probablement seulement pour le trouble obsessionnel git log-amateurs, et a de graves conséquences, y compris celles-ci:

  • Vous pourriez être réécriture d'une histoire commune, qui est le plus important N'est PAS tout, l'utilisation de Git. Si quelqu'un d'autre a cloné le dépôt, vous aurez briser cela. Ils auront à re-cloner afin d'éviter les maux de tête. Cela peut être OK, si le changement de nom est assez important, mais vous aurez besoin d'examiner attentivement -- vous pourriez finir par bouleverser toute une communauté opensource!
  • Si vous avez référencé le fichier à l'aide de son ancien nom plus tôt dans le référentiel de l'histoire, vous êtes effectivement de casser les versions antérieures. Pour remédier à cela, vous aurez à faire un peu plus hoop de sauter. Il n'est pas impossible, juste fastidieux et peut-être pas la peine.

Maintenant, puisque vous êtes toujours avec moi, vous êtes probablement en solo développeur de renommer un complètement isolé de fichier. Nous allons passer d'un fichier à l'aide d' filter-tree!

Supposons que vous allez déplacer un fichier old dans un dossier dir et donnez-lui le nom new

Cela pourrait être fait avec git mv old dir/new && git add -u dir/new, mais qui casse de l'histoire.

Au lieu de cela..

git filter-branch --tree-filter 'if [ -f old ]; then mkdir dir && mv old dir/new; fi' HEAD

va refaire chaque commit de la branche, l'exécution de la commande dans le tiques pour chaque itération. Beaucoup de choses peuvent aller mal lorsque vous faites cela. J'ai l'habitude de tester pour voir si le fichier est présent (sinon, il n'y pas encore de déplacer) et ensuite effectuer les démarches nécessaires au chausse-pied de l'arbre à mon goût. Ici vous pouvez sed par le biais de fichiers à modifier les références au fichier et ainsi de suite. Faites-vous plaisir! :)

Une fois terminé, le fichier est déplacé et le journal est intact. Vous vous sentez comme un ninja pirate.

Aussi; La mkdir dir n'est nécessaire que si vous déplacez le fichier dans un nouveau dossier, bien sûr. Le si va éviter la création de ce dossier plus tôt dans l'histoire que votre fichier existe.

49voto

Erik Hesselink Points 1570
git log --follow [file]

va vous montrer l'histoire par le biais de renomme.

28voto

James M. Greene Points 570

Je fais:

git mv {old} {new}
git add -u {new}

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