web-dev-qa-db-fra.com

Enregistrer l'opération de copie de fichiers avec Git

Lorsque je déplace un fichier dans git en utilisant git-mv, l'état montre que le fichier a été renommé et même si je modifie certaines parties, il considère toujours que c'est presque la même chose (ce qui est bien car il me permet de suivre l'historique de celui-ci) .

Lorsque je copie un fichier, le fichier d'origine a un historique que j'aimerais associer à la nouvelle copie.

J'ai essayé de déplacer le fichier, puis d'essayer de récupérer à l'emplacement d'origine - une fois que git déplacé ne me permettra pas de récupérer l'emplacement d'origine.

J'ai essayé de faire une copie du système de fichiers, puis d'ajouter le fichier - git le répertorie en tant que nouveau fichier.

Existe-t-il un moyen de faire git enregistrer une opération de copie de fichier d'une manière similaire à la façon dont il enregistre un fichier renommer/déplacer où l'historique peut être retracé jusqu'au fichier d'origine?

129
Hexdoll

Git ne renomme pas le suivi ni le suivi des copies, ce qui signifie qu'il n'enregistre pas les renommages ou les copies. Ce qu'il fait à la place, c'est renommer et copier détection. Vous pouvez demander la détection de renommage dans git diff (et git show) en utilisant le -M, vous pouvez demander une détection de copie supplémentaire dans les fichiers modifiés en utilisant -C option (-C implique -M), et vous pouvez demander une détection de copie plus coûteuse parmi tous les fichiers avec --find-copies-harder ou -C -C (ce qui implique -C, ce qui implique -M). Voir la page de manuel git-diff .

Vous pouvez également configurer git pour toujours faire la détection de renommage en définissant diff.renames à une valeur booléenne vraie (par exemple true ou 1), et vous pouvez également demander à git de faire une détection de copie en le définissant sur copy ou copies. Voir la page de manuel git-config .

Vérifiez également le -l option pour git diff et la variable de configuration associée diff.renameLimit.


Notez que git log <pathspec> fonctionne différemment dans Git: ici <pathspec> est un ensemble de délimiteurs de chemin, où chemin peut être un nom de (sous-) répertoire. Il filtre et simplifie l'historique avant que la détection de renommage et de copie n'entre en jeu. Si vous souhaitez suivre les renommages et les copies, utilisez git log --follow <filename> (qui est actuellement un peu limité et ne fonctionne que pour un seul fichier).

108
Jakub Narębski

Vous pouvez forcer Git à détecter l'historique du fichier copié:

  • Au lieu de copier, basculez vers une nouvelle branche et déplacez le fichier vers son nouvel emplacement.
  • Basculez vers la branche d'origine et renommez le fichier.
  • Fusionnez la nouvelle branche dans la branche d'origine, résolvant le conflit trivial en conservant les deux fichiers.
  • Restaurez le nom de fichier d'origine dans un commit séparé.

(Solution tirée de https://stackoverflow.com/a/44036771/138968 .)

30
Robert Pollak