2015-04-23 9 views
6

Jakiego algorytmu używa Git do określenia, że ​​jakiś plik został zmieniony?Skąd Git wie, że zmieniono nazwę pliku?

To, co git status produkowane zaledwie kilka minut wcześniej:

enter image description here

Informacje oznaczone żółtym polu jest nieprawidłowy. Właściwie nie było takiej zmiany nazwy. Pliki views/file/create.php i views/file/index.php zostały naprawdę usunięte po pół godzinie po utworzeniu zupełnie nowego zestawu dwóch plików - views/logo/create.php i views/logo/index.php.

Oba zestawy plików mogą wydawać się (do Git) dość podobne, ale pozostaje faktem - to nie są to same pliki o zmienionej nazwie. Jest to kompletny nowy zestaw plików, utworzony w innym katalogu około pół godziny przed usunięciem pierwszego zestawu plików.

Ponieważ informacje dostarczone przez Git są nieprawidłowe, chciałbym zaspokajać moją ciekawość i dlatego proszę.

+0

zgadzam się z Flosculus i po prostu chcesz dodać [to] (http://fabiensanglard.net/git_code_review/diff.php) Artykuł wchodząc nieco więcej szczegółów do algorytmów używanych do wykrywania podobieństwa. – wonderb0lt

+1

Nice! Cztery przegrane i 1 gwiazdka w ciągu zaledwie 2-3 minut, na pytanie, które jest perfekcyjnym dupe! :> Po prostu kocham społeczność SE. I ... oops ...przepraszam, że jestem autorem tego dupka, ale moje Google zostało zalane zimną kawą! – trejder

Odpowiedz

6

Od Wikipedia:

zmienia nazwy są obsługiwane domyślnie zamiast jawnie. Powszechną skargą z CVS jest to, że używa nazwy pliku do zidentyfikowania historii wersji , więc przeniesienie lub zmiana nazwy pliku nie jest możliwe bez przerwania jego historii lub zmiany nazwy historii, a tym samym uczynienia historii niedokładną. Większość systemów kontroli wersji po CVS rozwiązuje ten problem, nadając plikowi unikalną, długowieczną nazwę (rodzaj numeru i-węzła o numerze ), który przetrwał zmianę nazwy. Git nie rejestruje takiego identyfikatora i jest to zaleta. [34] [35] Kod źródłowy pliki są czasami dzielone lub łączone, a także po prostu zmieniana nazwa, [36] i zapisując to jako zwykłą zmianę nazwy, zamroziły niedokładny opis tego, co wydarzyło się w historii (niezmiennej). Git adresy problem wykrywając nazwy podczas przeglądania historii migawek zamiast nagrywać go podczas tworzenia migawki. [37] (Krótko, podając plik w wersji N, plik o tej samej nazwie w wersji N-1 jest domyślnym przodkiem .Jeśli jednak nie ma podobnego pliku w rewizji N-1, Git wyszukuje plik, który istniał tylko w wersji N-1 i jest bardzo podobny do nowego pliku:) Jednak wymaga to znacznie więcej pracochłonnej jednostki centralnej za każdym razem, gdy historia jest sprawdzana, oraz liczby opcji dostosowania heurystyki. Ten mechanizm nie zawsze działa; czasami plik, którego nazwa została zmieniona ze zmianami w tym samym zatwierdzeniu, jest odczytywany jako usunięcie starego pliku i utworzenie nowego pliku. Programiści mogą obejść to ograniczenie, zmieniając nazwę na i zmieniają się osobno.

Powiązane problemy