Как Git узнает, что файл переименован?

Какой алгоритм Git использует для определения того, что какой-то файл был переименован?

Это то, что git status производится всего за несколько минут до:

Информация, помеченная желтой рамкой , неверна. На самом деле такого переименования не было. файлы views/file/create.php а также views/file/index.php были действительно удалены через полчаса после совершенно нового набора из двух файлов - views/logo/create.php а также views/logo/index.php был создан.

Оба набора файлов могут показаться (для Git) довольно схожими, но факт остается фактом - это не одинаковые, переименованные файлы. Это полный новый набор файлов, созданный в другом каталоге примерно за полчаса до удаления первого набора файлов.

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

1 ответ

Решение

Из Википедии:

Переименования обрабатываются не явно, а неявно. Распространенная претензия к CVS заключается в том, что он использует имя файла для идентификации своей истории изменений, поэтому перемещение или переименование файла невозможно без прерывания его истории или переименования истории, что делает ее неточной. Большинство систем контроля версий после CVS решают эту проблему, присваивая файлу уникальное долгоживущее имя (своего рода номер инода), которое сохраняется после переименования. Git не записывает такой идентификатор, и это считается преимуществом.[34][35] Файлы исходного кода иногда разделяются или объединяются, а также просто переименовываются [36], и запись этого в виде простого переименования может привести к неточному описанию того, что произошло в (неизменной) истории. Git решает проблему, обнаруживая переименования при просмотре истории снимков, а не записывая их при создании снимка.[37] (Вкратце, учитывая файл в ревизии N, файл с таким же именем в ревизии N-1 является его предком по умолчанию. Однако, когда в ревизии N-1 нет файла с одинаковым именем, Git ищет файл, который существовал только в ревизии N-1 и очень похож на новый файл.) Однако, он требует более интенсивной работы процессора каждый раз, когда просматривается история, и ряда опций для настройки эвристики. Этот механизм не всегда работает; иногда файл, который переименовывается с изменениями в том же коммите, читается как удаление старого файла и создание нового файла. Разработчики могут обойти это ограничение, фиксируя переименование и изменения отдельно.

Другие вопросы по тегам