Wikipedia wyjaśnia automatyczne wykrywanie zmiany nazwy:
Krótko mówiąc, biorąc pod uwagę plik w wersji N, plik o tej samej nazwie w wersji N-1 jest jego domyślnym przodkiem. Jednak gdy nie ma pliku o takiej samej nazwie w wersji N − 1, Git szuka pliku, który istniał tylko w wersji N − 1 i jest bardzo podobny do nowego pliku.
Wykrywanie zmiany nazwy najwyraźniej sprowadza się do podobnego wykrywania plików. Czy ten algorytm jest gdzieś udokumentowany? Dobrze byłoby wiedzieć, jakie rodzaje transformacji są wykrywane automatycznie.
Odpowiedzi:
Git śledzi zawartość plików, a nie nazwy plików. Tak więc zmiana nazwy pliku bez zmiany jego zawartości jest łatwa do wykrycia przez git. (Git nie śledzi, ale wykonuje wykrywanie ; używanie
git mv
lubgit rm
igit add
faktycznie jest tym samym).Kiedy plik jest dodawany do repozytorium, nazwa pliku znajduje się w obiekcie drzewa. Rzeczywista zawartość pliku jest dodawana jako duży obiekt binarny ( blob ) w repozytorium. Git nie doda kolejnego obiektu BLOB dla dodatkowych plików, które zawierają tę samą zawartość. W rzeczywistości Git nie może, ponieważ zawartość jest przechowywana w systemie plików, gdzie pierwsze dwa znaki skrótu to nazwa katalogu, a reszta to nazwa pliku w nim zawartego. Zatem wykrycie zmian nazw jest kwestią porównania skrótów.
Aby wykryć niewielkie zmiany w pliku o zmienionej nazwie, Git używa pewnych algorytmów i limitu progowego, aby sprawdzić, czy jest to zmiana nazwy. Na przykład spójrz na
-M
flagęgit diff
. Istnieją również wartości konfiguracyjne, takie jakmerge.renameLimit
(liczba plików do rozważenia podczas wykonywania wykrywania zmiany nazwy podczas scalania).Aby zrozumieć, jak git traktuje podobne pliki (tj. Jakie transformacje plików są traktowane jako zmiany nazw), zapoznaj się z dostępnymi opcjami konfiguracji i flagami, jak wspomniano powyżej. Nie musisz się zastanawiać, jak. Aby zrozumieć, w jaki sposób git faktycznie wykonuje te zadania, spójrz na algorytmy do znajdowania różnic w tekście i przeczytaj kod źródłowy git.
Algorytmy są stosowane tylko do porównywania, scalania i rejestrowania - nie mają wpływu na sposób ich przechowywania przez git. Każda niewielka zmiana w zawartości pliku oznacza dodanie do niego nowego obiektu. Na tym poziomie nie występuje delta ani różnica. Oczywiście później obiekty mogą być pakowane tam, gdzie delty są przechowywane w plikach packfiles, ale nie jest to związane z wykrywaniem zmiany nazwy.
źródło
Istnieje wiele algorytmów, które wykrywają podobieństwa między tekstami, a systemy kontroli wersji często już używają ich do przechowywania tylko różnic między dwiema wersjami. Narzędzia takie jak WinMerge są wystarczająco inteligentne, aby wykrywać różnice, nawet w wierszach, więc nie widzę powodu, dla którego te algorytmy nie miałyby być używane do wykrywania zmiany nazwy.
Oto dyskusja na temat algorytmów wykrywania podobnych tekstów . Niektóre z tych algorytmów mogą być zoptymalizowane dla języków naturalnych, podczas gdy inne mogą działać lepiej dla kodu źródłowego, ale w istocie są bardzo podobne.
źródło