2009-07-29 8 views
8

To może być bardziej odpowiednie jako problem w jakimkolwiek trackerze problemów/forum, którego używa Git, ale myślałem, że najpierw otrzymam potwierdzenie/wyjaśnienie SO:Czy Git traktuje dodawanie/usuwanie jako zmianę nazwy?

Mam repo śledzenie paczki plików wykonywalnych instalatora.

Powiedzmy, że foo-1.0.exe jest już w repozytorium.

Dodaję teraz plik foo-2.0.exe do tego samego katalogu (git add foo-2.0.exe). Następnie usuwam plik foo-1.0.exe (git rm foo-1.0.exe).

Oczekuję, że status Git pokaże mi jeden dodany plik i jeden usunięty plik. Zamiast tego, mam to:


na oddział mistrza
zmiany zostaną popełnione:
(use "git resetowania głowie ..." do unstage)
przemianowany: bla-1.0.exe - > foo2.0.exe

To jest dla mnie WTF ... czy Git używa jakiejś heurystyki do odgadnięcia, że ​​2.0 to aktualizacja do 1.0 ... Rozumiem, jak to może mieć sens, ale ja nie myśl, że chcę to zrobić w tym przypadku.

+1

btw używam kontroli wersji tylko dla kodu źródłowego. tak długo, jak masz dobre systemy kompilacji, pliki wykonywalne powinny być odtwarzalne – yairchu

+0

Ha ha. Tak, wiem - tak powinno się to odbyć. Twoje fantazyjne budki z jednym kliknięciem nie są mile widziane w tych częściach - daj nam dekadę. (oraz niektóre instalatory są aplikacjami innych firm) – fakeleft

Odpowiedz

15

Masz rację, że Git używa heurystyki. Git śledzi tylko zawartość, więc repozytorium wie tylko, że kiedyś był foo-1.0.exe, a teraz jest foo-2.0.exe. W twoim przypadku, git status używa dostępnych informacji do zgadnij, że mogła nastąpić zmiana nazwy (plus kilka drobnych zmian, twoje dwa pliki są prawdopodobnie bardzo podobne). To nie ma wpływu na to, co jest zapisane w repozytorium.

Ta filozofia śledzenia wyłącznie treści, a nie delt, pozwala Git ewoluować i zapewnia coraz lepsze narzędzia do poruszania się po historii repozytorium. Ostatecznie Git zapewni sposób śledzenia ewolucji określonego fragmentu kodu, na poziomie funkcji, a nawet linii, poprzez zmiany nazwy lub refaktoryzację lub dowolną inną modyfikację kodu. Można to zrobić bez konieczności wcześniejszego przechowywania tych informacji w repozytorium.

+0

Prawdopodobnie masz skonfigurowane Git do automatycznego wykrywania nazw ("diff.renames"). –

+0

@Jakub - jeśli to działa zgodnie z oczekiwaniami, możesz chcieć swój komentarz jako odpowiedź, abym mógł go zaakceptować. Niedługo to przetestuję - ach. Greg, dzięki za ogólny wgląd. – fakeleft

+0

Tak ... cóż ... w moim przypadku git jest całkowicie błędny i byłoby wspaniale wiedzieć, jak zapobiec takiej sytuacji. –