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 pop
aby odzyskać całą zawartość. Moje ruchy zniknęły z listy zmian, więc poprawiłem je za pomocą, git rm
a 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
, -C
i --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ć?
Odpowiedzi:
Spróbuj
git log --follow
w swoim pliku. Dowiaduję się stąd. Czy można przenosić / zmieniać nazwy plików w git i zachowywać ich historię?źródło
fatal: ambiguous argument 'file.txt': unknown revision or path not in the working tree
, spróbuj git log --follow - file.txtCóż, widzę moje zmiany z
git log -M --summary
...źródło
git log -M --summary
nie podaje żadnych informacji o zmianie nazwy, jeśli patrzysz tylko na historię jakiegoś podanego pliku, tj. z argumentem plik.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 --follow
chociaż nadal nie działa dla mnie.)Po pierwsze,
--summary
dziennik zatwierdzenia zmiany nazwy zawieradelete
wiersz ze starą nazwą pliku. Więc jeśli łatwo to zauważyć, możesz znaleźć jego starą nazwę igit log
stamtą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 -C
moż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
git log --follow .
gdzie katalog roboczy jest nową lokalizacją, nie działa, podczas gdygit log --follow path/to/new/dir
, wykonywany ze wspólnego katalogu nadrzędnego starej i nowej lokalizacji, działa--follow
Parametr działa, ale trzeba zrobić:git log --follow -- ./path/to/file
git -log filename.cs
zatrzymuje 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. Alegit log -10 --follow filename.cs
pokazuje również dziennik przed zatwierdzeniem ruchu.Myślę, że właśnie tego szukasz.
źródło