J'ai renommé quelques fichiers à l'aide de git mv
, utilisé git stash
, a jeté un rapide coup d'œil à HEAD (sans le changer) puis git stash pop
pour récupérer le tout. Mes mouvements avaient disparu de la liste de validation, je les ai donc refaits avec git rm
et le message de validation affirmait que git avait repéré que le changement de nom était un changement de nom. Alors je n'y ai plus pensé.
Mais maintenant, après la validation, je ne peux pas accéder à l'historique des fichiers déplacés! Voici ce que git dit sur le commit en question:
~/projects% git log --summary
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date: Wed Dec 8 22:37:54 2010 +0000
Moved R_DebugUI into runtime
delete mode 100644 test/R_DebugUI_iOS.h
delete mode 100644 test/R_DebugUI_iOS.m
create mode 100644 system/runtime/src/R_DebugUI_iOS.h
create mode 100644 system/runtime/src/R_DebugUI_iOS.m
<<snip older commits>>
~/projects%
J'essaie maintenant d'obtenir l'historique de l'un de ces fichiers déplacés, donc je peux regarder une ancienne version, mais je n'ai rien de très utile:
~/projects/system/runtime/src% git log --follow --find-copies-harder -M -C R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date: Wed Dec 8 22:37:54 2010 +0000
Moved R_DebugUI into runtime
~/projects/system/runtime/src%
(Je l'ai également essayé sans -M
, -C
et --find-copies-harder
, mais en vain.)
Je peux obtenir son historique sous son ancien nom, qui s'arrête au point où il a été supprimé de son ancien emplacement:
~/projects% git log --summary --follow --find-copies-harder -M -C -- test/R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date: Wed Dec 8 22:37:54 2010 +0000
Moved R_DebugUI into runtime
delete mode 100644 test/R_DebugUI_iOS.m
commit 32a22d53c27e260714f759ecb3d3864e38b2e87f
Author: brone
Date: Tue Dec 7 23:52:51 2010 +0000
Can set debug UI's alpha.
<<snip older commits>>
~/projects%
Je ne suis donc pas complètement coincé cette fois, mais je n'aurais pas envie de devoir faire ce genre de choses tout le temps. (Je prévois avoir un bon nombre de fichiers qui se déplaceront au moins une fois dans leur vie.)
Est-ce que je fais quelque chose de mal? L'ancienne copie du fichier et la nouvelle copie sont identiques à 98,8% (2 lignes sur 166 modifiées). Ma compréhension est que git devrait être capable de suivre le fichier dans ce cas, car il déduit les opérations de renommage plutôt que de les stocker explicitement, et les fichiers sont suffisamment similaires pour que je pense qu'il devrait les considérer comme les mêmes.
Puis-je faire quelque chose pour résoudre ce problème?
Répondre à ma propre question, car j'ai réussi à apaiser mes inquiétudes, même si je n'ai pas résolu mon problème exactement. (git log --follow
ne fonctionne toujours pas pour moi.)
Tout d'abord, le --summary
le journal du commit renommé inclut la ligne delete
avec l'ancien nom du fichier. Donc, si c'est facile à repérer, vous pouvez trouver son ancien nom et git log
De là.
Si cela fait partie d'un gros commit, et donc un peu plus difficile à repérer - et cette situation était l'un de mes soucis - git blame -C
peut être utilisé avec le nouveau nom du fichier lors de la première révision post-renommage. Vraisemblablement, les lignes restent du fichier d'origine! - donc git devrait trouver leur source, et montrer l'ancien nom de fichier (et un hachage de validation pour faire bonne mesure). Vous pouvez ensuite reprendre la piste avec git log
.
Donc, si vous vous intéressez à l'historique du fichier en tant qu'unité (pour une raison quelconque), il semble que cela puisse être fait de manière relativement simple. Bien que j'aie l'impression que Git préférerait que vous l'utilisiez correctement.
Veuillez essayer avec git log --follow
dans votre fichier. J'apprends d'ici Est-il possible de déplacer/renommer des fichiers dans git et de conserver leur historique?
Eh bien, je vois mes noms avec git log -M --summary
..
git log --follow ./path/to/file
Je crois que c'est ce que vous recherchez.