Git отслеживает содержимое файла, а не имена файлов.Поэтому переименование файла без изменения его содержимого легко обнаружить.(Git не отслеживает, но выполняет обнаружение ; использование git mv
или git rm
и git add
фактически одинаково.)
Когда файлдобавлено в хранилище, имя файла находится в объекте дерева.Фактическое содержимое файла добавляется как большой двоичный объект ( blob ) в хранилище.Git не будет добавлять еще один BLOB-объект для дополнительных файлов, содержащих такое же содержимое.Фактически, Git не может, поскольку контент хранится в файловой системе, причем первые два символа хэша являются именем каталога, а остальные - именем файла внутри него.Таким образом, для обнаружения переименований необходимо сравнить хэши.
Чтобы обнаружить небольшие изменения в переименованном файле, Git использует определенные алгоритмы и пороговое значение, чтобы определить, является ли это переименованием.Например, посмотрите на флаг -M
для git diff
.Существуют также значения конфигурации, такие как merge.renameLimit
(количество файлов, которые следует учитывать при выполнении обнаружения переименования во время слияния).
Чтобы понять, как git обрабатывает похожих файлов (т.е. какой файлпреобразования рассматриваются как переименования), изучите параметры конфигурации и доступные флаги, как указано выше.Вам не нужно рассматривать как.Чтобы понять, как git на самом деле выполняет эти задачи, посмотрите на алгоритмы поиска различий в тексте и прочитайте исходный код git.
Алгоритмы применяются только для целей diff, merge и log - они не влияюткак Git хранит их.Любое небольшое изменение содержимого файла означает, что для него добавлен новый объект.На этом уровне не происходит разницы или различий.Конечно, позже объекты могут быть упакованы там, где дельты хранятся в пакетных файлах, но это не связано с обнаружением переименования.