Исправлять нечего.
Каждый Git коммит содержит снимок всех файлов. Эти файлы имеют имена. Если вы переименуете файл и подтвердите, затем сравните старый и новый снимки:
old snapshot new snapshot
------------ ------------
README.md README.md
file.ext file.ext
oldname.ext
newname.ext
zfile.ext zfile.ext
Как видите, разница между "старым снимком" и "новым снимком" заключается в том, что старый файл oldname.ext
был удален, и был добавлен совершенно новый новый файл newname.ext
.
Что Git делает с таким снимком, так это обнаружение переименований. Для каждого файла слева, который удаляется, и каждого файла справа, который только что добавлен, Git помещает имена в кучу «потенциальных переименований». Затем он смотрит сквозь груды. Здесь есть только одна пара имен, которые могут быть спарены. Git будет смотреть содержимое из oldfile.ext
в старом коммите и newfile.ext
в новом коммите. Если содержимое совпадает или достаточно близко, Git говорит: Ага, файл переименован! И вместо «удалить старый файл, добавить новый файл» вы получите «переименовать старый файл в новый файл».
Различные версии Git имеют несколько разные детекторы переименования. Основное различие - , сколько имен может go в очереди. По умолчанию для очень старых версий Git:
- вообще не обнаруживает переименования, если не указано;
- использует максимум 100 пар имен.
В современном Git «обнаружение переименований» по умолчанию установлено на на и имеет по умолчанию максимум 400 пар имен, при этом последний предел был увеличен в Git 1.7.5.
Вы можете сами увеличить предел: есть переменная конфигурации diff.renameLimit
, которая по умолчанию использует встроенную настройку по умолчанию. Установите любое значение, которое вам нравится в вашем файле конфигурации. Установка его в ноль говорит Git, что нужно стараться изо всех сил.
Это означает, что два git diff
запускаются на одинаковых коммитах в одинаковых * Репозиторий 1041 *, может давать разные ответы о том, какие файлы были переименованы, а какие были просто удалены и добавлены В git diff
время вы выбираете, каким образом вы хотите, чтобы разница была рассчитана и отображена. У базовых коммитов просто есть старое имя (в старом коммите) и новое имя (в новом коммите): здесь ничего не изменится, и повторное выполнение коммитов не поможет. Какие значения имеют различные ручки управления:
- Включен ли детектор переименования? (
diff.renames
) - Какое ограничение на количество имен файлов? (
diff.renameLimit
) - Какой порог для принятия решения о том, что два файла с разными именами, но одинаковым, но не на 100% идентичным содержимым, являются "одним файлом"? Последний задается аргументом
-M
для вашей команды git diff
. Передача -M
устанавливает diff.renames
в true
, даже если в вашей конфигурации он будет false
.
Команда git status
выполняется с включенным обнаружением переименования и установленным порогом подобия на "50% похоже". Конфигурация или ручка командной строки для изменения значения подобия отсутствуют. До недавнего времени здесь не было параметров конфигурации для отключения обнаружения переименования, но Git 2.18 добавил это вместе с параметром конфигурации status.rename
, как описано в примечаниях к выпуску .
( Существует также более изящный алгоритм детектора переименования каталогов, который некоторое время был экспериментальным, и я думаю, что он все еще существует с Git 2.18, но он не очень хорошо описан. Из документации он, кажется, используется только во время слияний , а не diffs, что странно, поскольку слияния на самом деле выполняются внутри diffs. См. первый пункт в приведенных выше примечаниях к выпуску.)