Запись операции копирования файла с помощью Git - PullRequest
128 голосов
/ 25 июня 2009

Когда я перемещаю файл в git с помощью git-mv, статус показывает, что файл был переименован, и даже если я изменяю некоторые его части, он по-прежнему считается почти тем же самым (что хорошо, потому что позволяет мне следить за историей этого).

Когда я копирую файл, исходный файл имеет некоторую историю, которую я хотел бы связать с новой копией.

Я попытался переместить файл, а затем попытаться повторно оформить заказ в исходном месте - после перемещения git не разрешит мне проверить исходное местоположение.

Я попытался сделать копию файловой системы, а затем добавить файл - git отображает его как новый файл.

Есть ли способ заставить git record выполнить операцию копирования файла аналогично тому, как она записывает переименование / перемещение файла, при котором история может быть прослежена до исходного файла?

Ответы [ 2 ]

107 голосов
/ 25 июня 2009

Git не отслеживает переименование и не копирует, что означает, что он не записывает переименовывает или копирует. Вместо этого он переименовывает и копирует обнаружение . Вы можете запросить обнаружение переименования в git diffgit show) с помощью параметра -M, вы можете запросить дополнительное обнаружение копирования в измененных файлах с помощью параметра -C (-C подразумевает -M) и Вы можете запросить более дорогое обнаружение копирования среди всех файлов с --find-copies-harder или -C -C (что подразумевает -C, что подразумевает -M). См. Справочную страницу git-diff .

Вы также можете настроить git на обнаружение переименования, установив для diff.renames логическое истинное значение (например, true или 1), и вы можете запросить git также выполнить обнаружение копирования, установив для него copy или copies. См. Справочную страницу git-config .

Проверьте также параметр -l для git diff и соответствующую переменную конфигурации diff.renameLimit.


Обратите внимание, что git log <pathspec> работает в Git иначе: здесь <pathspec> - это разделитель пути, где path может быть (под) именем каталога. Он фильтрует и упрощает историю до переименования и обнаружения копирования. Если вы хотите следить за переименованием и копированием, используйте git log --follow <filename> (который в настоящее время немного ограничен и работает только для одного файла).

30 голосов
/ 29 сентября 2017

Вы можете заставить Git обнаруживать историю скопированного файла:

  • Вместо копирования переключитесь на новую ветвь и переместите файл в его новое место там.
  • Переключиться на исходную ветку и переименовать файл.
  • Объединить новую ветвь с исходной, разрешив тривиальный конфликт, сохранив оба файла.
  • Восстановить исходное имя файла в отдельном коммите.

(Решение взято из https://stackoverflow.com/a/44036771/1389680.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...