git 'mv' не помечал каждый файл как переименованный (некоторые удалены / добавлены) - PullRequest
0 голосов
/ 12 февраля 2020

В ветке обслуживания я переместил исходную папку для всего сайта, используя git mv old new. В то время я видел, как git status показывает много переименований, поэтому я приступил к фиксации и разработке работы над этим (включая несколько дальнейших переименований). в этом mv коммите было обнаружено несколько переименований, но не все, поэтому многие из моих файлов, похоже, потеряли свою историю. Это странно, поскольку у меня не было никаких изменений, мой коммит был просто переименованием каталога.

С тех пор я слил эту ветку в другую, и после долгого процесса слияния я получил все отсортировано и проверено. Я решил проверить историю файла только для того, чтобы заметить, что он восходит к исходному переименованию.

Я перенес все эти изменения в удаленный. Я работаю здесь один, поэтому могу конфликтовать только с собой. Было бы тяжело потерять историю этого проекта для каждого файла, но это также было бы огромной болью для go возврата и повторения всего этого, включая слияние.

Есть ли способ go вернуть и исправить это первоначальное переименование без необходимости go через огромное слияние, которое я уже сделал?

1 Ответ

1 голос
/ 12 февраля 2020

Исправлять нечего.

Каждый 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. См. первый пункт в приведенных выше примечаниях к выпуску.)

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