Dlaczego dziennik git może nie wyświetlać historii przenoszonego pliku i co mogę z tym zrobić?

91

Zmieniłem nazwy kilku plików, używając git mv, użyłem git stash, rzuciłem okiem na HEAD (bez zmiany), a następnie zrobiłem, git stash popaby odzyskać całą zawartość. Moje ruchy zniknęły z listy zmian, więc poprawiłem je za pomocą, git rma komunikat o zatwierdzeniu twierdził, że git zauważył, że zmiana nazwy to zmiana nazwy. Więc więcej o tym nie myślałem.

Ale teraz, po zatwierdzeniu, nie mogę dostać się do historii przeniesionych plików! Oto co git mówi o rozpatrywanym zatwierdzeniu:

~/projects% git log --summary
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.h
 delete mode 100644 test/R_DebugUI_iOS.m
 create mode 100644 system/runtime/src/R_DebugUI_iOS.h
 create mode 100644 system/runtime/src/R_DebugUI_iOS.m

 <<snip older commits>>
 ~/projects%

Próbuję teraz uzyskać historię jednego z tych przeniesionych plików, więc mogę spojrzeć na starą wersję, ale nie mam nic bardzo przydatnego:

~/projects/system/runtime/src% git log --follow --find-copies-harder -M -C R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime
~/projects/system/runtime/src% 

(Ja również próbowałem go bez -M, -Ci --find-copies-harder, ale bezskutecznie.)

Mogę pobrać jego historię pod starą nazwą, która kończy się w miejscu, w którym została usunięta ze starej lokalizacji:

~/projects% git log --summary --follow --find-copies-harder -M -C -- test/R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.m

commit 32a22d53c27e260714f759ecb3d3864e38b2e87f
Author: brone
Date:   Tue Dec 7 23:52:51 2010 +0000

    Can set debug UI's alpha.

<<snip older commits>>
~/projects%

Więc tym razem nie utknąłem całkowicie, ale nie miałbym ochoty robić tego przez cały czas. (Spodziewam się, że będzie spora liczba plików, które zostaną przeniesione przynajmniej raz w życiu).

czy robię coś źle? Stara kopia pliku i nowa kopia są w 98,8% takie same (zmieniono 2 wiersze ze 166). Rozumiem, że git powinien być w stanie śledzić plik w tym przypadku, ponieważ wnioskuje o operacjach zmiany nazwy, a nie zapisuje je jawnie, a pliki są na tyle podobne, że uważam, że powinien uznać je za takie same.

Czy jest coś, co mogę zrobić, aby to naprawić?


źródło
Zgadnij: Czy to działa, jeśli wykonasz polecenie w ~ / projects / zamiast ~ / projects / system / runtime / src?
Douglas,
Nie, otrzymuję ten sam wynik. (Generalnie git wydaje się całkiem niezły, jeśli chodzi o pozwolenie ci być w dowolnym folderze ...)
To jednak dało mi pewien pomysł i zaktualizowałem pytanie o moje ustalenia. Dziękuję za komentarz!
używam „tortoiseGit 1.5.8.0” razem z „1.7.3.1.msysgit.0” w mswindows. Kiedy zmieniam nazwę + zatwierdzam plik w eksploratorze, widzę w moim gui "status = Zmień nazwę". Nie wiem wystarczająco dużo o git, jak to zrobić w linii poleceń, aby odpowiedzieć „jak to zrobić”, ale tortoiseGit zrobił dla mnie coś, co zadziałało zgodnie z oczekiwaniami.
k3b
3
Czy to oszustwo? stackoverflow.com/questions/2314652/ ...
cregox

Odpowiedzi:

28

Cóż, widzę moje zmiany z git log -M --summary...

user502515
źródło
git log -M --summarynie podaje żadnych informacji o zmianie nazwy, jeśli patrzysz tylko na historię jakiegoś podanego pliku, tj. z argumentem plik.
vinc17
17

Odpowiadając na własne pytanie, ponieważ udało mi się złagodzić moje obawy, nawet jeśli nie rozwiązałem dokładnie mojego problemu. ( git log --followchociaż nadal nie działa dla mnie.)

Po pierwsze, --summarydziennik zatwierdzenia zmiany nazwy zawiera deletewiersz ze starą nazwą pliku. Więc jeśli łatwo to zauważyć, możesz znaleźć jego starą nazwę i git logstamtąd.

Jeśli jest to część jakiegoś dużego zatwierdzenia, a zatem jest nieco trudniejsze do wykrycia - a ta sytuacja była jednym z moich zmartwień - git blame -Cmoże zostać użyta z nową nazwą pliku przy pierwszej wersji po zmianie nazwy. Prawdopodobnie z oryginalnego pliku pozostały linie! - więc git powinien znaleźć ich źródło i pokazać starą nazwę pliku (i skrót zatwierdzenia). Możesz wtedy wybrać szlak za pomocą git log.

Tak więc, jeśli interesuje Cię historia pliku jako jednostka (z jakiegokolwiek powodu), wydaje się, że można to zrobić stosunkowo prosto. Chociaż mam wrażenie, że git wolałby, żebyś użył go właściwie.


źródło
6
Myślę, że potrzebujesz opcji -M, aby faktycznie wyświetlać zmiany nazwy, a nie usuwać / dodawać
Adrian Cornish,
1
Właśnie miałem ten sam problem i zauważyłem, że twój katalog roboczy robi różnicę, git log --follow .gdzie katalog roboczy jest nową lokalizacją, nie działa, podczas gdy git log --follow path/to/new/dir, wykonywany ze wspólnego katalogu nadrzędnego starej i nowej lokalizacji, działa
akraf
1
--followParametr działa, ale trzeba zrobić:git log --follow -- ./path/to/file
Drumm
Mam problem, który git -log filename.cszatrzymuje się po zatwierdzeniu ruchu pliku (bieżący katalog jest ustawiony na folder pliku). Jednak okno historii VS pokazuje cały dziennik zmian plików. Widzę również, że plik został przeniesiony na pulpit Github. Ale git log -10 --follow filename.cspokazuje również dziennik przed zatwierdzeniem ruchu.
oleksa
12
git log --follow ./path/to/file

Myślę, że właśnie tego szukasz.

janetkuo
źródło
3
Odpowiedź sprzed pięciu lat zawiera te informacje.
dotancohen