Операция копирования файла записи с помощью Git

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

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

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

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

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

Ответ 1

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

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

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


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

Ответ 2

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

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

(Решение взято из fooobar.com/info/51799/....)