Dlaczego „git log -‌- foo” nie działa dla usuniętego pliku foo?


89

Moje repozytorium przeszło takie zmiany jak:

  1. ... kilka niepowiązanych zatwierdzeń ...
  2. Zatwierdź nowy plik fooze 100 wierszami treści
  3. ... interweniujące zobowiązania, z których niektóre dotykają foo...
  4. Wstaw zawartość foona górze istniejącego pliku bari git rm foow tym samym zatwierdzeniu
  5. ... więcej niepowiązanych zatwierdzeń ...

Teraz chcę zobaczyć dziennik usuniętego pliku foo. Wszystko, co przeczytałem, w tym na SO, mówi, że powinienem być w stanie git log -- foo, ale to polecenie nie daje wyjścia.

Jeśli znajdę zatwierdzenie, które obejmuje usuwanie foo, mogę git log 1234abcd -- fooi zobaczyć jego dziennik, więc myślę, że moja ścieżka do foonie jest problemem. Zauważ również, że dane git merge-base HEAD 1234abcdwyjściowe 1234abcd[...], więc myślę, że powinno to udowodnić, że zatwierdzenie jest osiągalne z HEAD. Zauważ, że nie ma pliku foow moim drzewie roboczym (oczywiste, ponieważ został usunięty). Korzystanie z Git 1.7.1.1 w systemie OS X.

Dlaczego git log -- foou mnie nie działa i jak mogę to naprawić? Dzięki!


5
Czy próbowałeś git log --follow -- fooczy git log --follow -M -- foo? (aby wymusić wykrycie zmiany nazwy)
VonC,

1
Cholera, próbowałem - --followale czytając history, widzę, że odkąd wykonałem CD w innym miejscu, kiedy to wypróbowałem, unieważniając ścieżkę. git log --follow -- foozadziałało, gdy próbowałem od właściwego punktu wyjścia. Chyba Git rozważyć toczenia foosię barjako pewnego rodzaju zmiany nazwy? W każdym razie dziękuję! Z przyjemnością to uznam, jeśli prześlesz to ponownie jako odpowiedź.
user385804

1
Irytujące, które --zmienia się na w tytule pytania ...
Cascabel

Odpowiedzi:


118

Chcesz użyć --followopcji on git log, która jest opisana na stronie podręcznika jako:

Continue listing the history of a file beyond renames.

W efekcie pozwala to nie tylko zobaczyć historię pliku o zmienionej nazwie, ale także umożliwia przeglądanie historii pliku, którego nie ma już w drzewie roboczym. Więc polecenie, którego powinieneś użyć, powinno wyglądać mniej więcej tak:

git log --follow -- foo

Aktualizacja:

Git 2.9+ ma teraz domyślnie włączone to dla wszystkich poleceń git diffi git log:

Komendy poziomu Porcelain dla użytkownika końcowego z rodziny „git diff” i „git log” domyślnie włączają wykrywanie zmiany nazwy; nadal możesz użyć zmiennej konfiguracyjnej "diff.renames", aby to wyłączyć.

Dzięki x-yuri za heads up!


1
U mnie zadziałało bez --followroli. Musiałem tylko dodać --. Biegnę git-2.9.0.
x-yuri,
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.