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ć?


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

Odpowiedzi:



28

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


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.


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.


3
Odpowiedź sprzed pięciu lat zawiera te informacje.
dotancohen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.