Когда я перемещаю файл в git с помощью git-mv, статус показывает, что файл был переименован, и даже если я изменяю некоторые части, он все еще считает почти то же самое (что хорошо, потому что позволяет мне следить за его историей) .
Когда я копирую файл, у исходного файла есть история, которую я хотел бы связать с новой копией.
Я попытался переместить файл, а затем попытался повторно оформить заказ в исходном месте - после перемещения git не позволит мне проверить исходное расположение.
Я попытался сделать копию файловой системы, а затем добавить файл - git перечисляет его как новый файл.
Есть ли способ заставить git записывать операцию копирования файла аналогично тому, как он записывает переименование / перемещение файла, где история может быть прослежена до исходного файла?
Ответы:
Git не выполняет отслеживание переименований и копий, что означает, что он не записывает переименований или копий. Вместо этого он выполняет переименование и обнаружение копирования . Вы можете запросить обнаружение переименования в
git diff
(иgit show
), используя-M
опцию, вы можете запросить дополнительное обнаружение копий в измененных файлах, используя-C
опцию (-C
подразумевает-M
), и вы можете запросить более дорогостоящее обнаружение копий среди всех файлов с помощью--find-copies-harder
или-C -C
(-C
что подразумевает-M
). См. Справочную страницу git-diff .Вы также можете настроить git так, чтобы он всегда выполнял обнаружение переименования, установив
diff.renames
логическое значение true (например,true
или1
), и вы можете запросить git для обнаружения копирования, установив для него значениеcopy
илиcopies
. См. Справочную страницу git-config .Также проверьте
-l
параметрgit diff
и соответствующую переменную конфигурацииdiff.renameLimit
.Обратите внимание, что
git log <pathspec>
в Git работает по-другому: вот<pathspec>
набор разделителей пути, где путь может быть именем (под) каталога. Он фильтрует и упрощает историю, прежде чем в игру вступит переименование и обнаружение копирования. Если вы хотите следить за переименованием и копированием, используйтеgit log --follow <filename>
(который в настоящее время немного ограничен и работает только для одного файла).источник
diff.renames
значениеcopies
(например, «git config diff.renames copies
»). Я согласен, что это немного нелогично.git log -L123,456:file.xyz
), который правильно следует за переименованием, но не копирует, и вы не можете передать --follow в этом случае; кроме того, AFAICT, это не работает с git blame.2020-05-19: следующее решение имеет преимущества в том, что не меняет журнал исходного файла, не создает конфликт слияния и он короче.
Вы можете заставить Git определять историю скопированного файла за три коммита:
--no-ff
.(Кредиты принадлежат Раймонду Чену .)
В первом решении было четыре коммита:
(Решение взято из https://stackoverflow.com/a/44036771/1389680 .)
источник
move
иrename
?mv
обе операции? Я использовал «переместить» для случая, когда может потребоваться изменение каталога файла, и «переименовать» там, где это не так.git mv orig new
? Вы имеете в виду под "прочитал оригинал"cp new orig && git add orig
?