Jestem stosunkowo nowy w git. Wcześniej korzystałem z Subversion.
Zauważyłem, że większość graficznych interfejsów Git i wtyczek IDE nie wydaje się być w stanie wyświetlić historii pliku, jeśli nazwa pliku została zmieniona. Kiedy używam
git log --follow
w wierszu poleceń widzę cały dziennik po zmianie nazw.
Według Linusa Torvaldsa ( link alternatywny ) --follow
przełącznik jest przyjemny dla „noob SVN”; poważni użytkownicy Git nie używają go:
--follow to totalny hack, mający po prostu zadowolić byłych użytkowników SVN, którzy i tak nigdy nie wiedzieli nic o takich rzeczach, jak rodzicielstwo czy ładne wykresy wersji.
Nie jest to całkowicie fundamentalne, ale obecna implementacja "--follow" jest naprawdę szybkim procesem wstępnym, przykręconym do logiki chodzenia po rewizji, a nie jest czymś naprawdę integralnym.
Dosłownie został zaprojektowany jako przyjemny element „SVN noob”, a nie jako „prawdziwa funkcjonalność gita”. Pomysł polegał na tym, że oderwałbyś się od (zepsutego) sposobu myślenia, że zmiana nazwy ma znaczenie w szerszym kontekście.
Moje pytanie : W jaki sposób zagorzali użytkownicy git wśród was uzyskują historię pliku po zmianie jego nazwy? Jaki jest „prawdziwy” sposób na zrobienie tego?
git mv oldfile newfile
nie powoduje zmiany nazwy mają być rejestrowane w ogóle - to tak samo jak usuwanie jednego pliku i dodanie drugiego. git wyszukuje tylko zmiany nazwy i kopiuje stan drzewa przy każdym zatwierdzeniu po fakcie./bin/mv oldfile newfile
), Ale potem to zrobiszgit add newfile; git rm oldfile
, wynik jest nie do odróżnienia od wynikugit mv oldfile newfile
.git log --follow
poprawia się nieco dzięki git 2.9 (czerwiec 2016): zobacz moją odpowiedź poniżej--color-moved
kiedydiff
.Odpowiedzi:
Myślę, że głównym motywem przewodnim Linusa jest to, że - i weź to z przymrużeniem oka - hardkorowi użytkownicy gita nigdy nie przejmują się historią „pliku”. Umieszczasz zawartość w repozytorium git, ponieważ zawartość jako całość ma znaczącą historię.
Zmiana nazwy pliku to mały, specjalny przypadek „zawartości” przemieszczającej się między ścieżkami. Możesz mieć funkcję, która przenosi się między plikami, które użytkownik git może śledzić za pomocą „kilofa” (np
log -S
.).Inne zmiany „ścieżki” obejmują łączenie i dzielenie plików; git tak naprawdę nie obchodzi, który plik uważasz za zmieniony, a który uważasz za skopiowany (lub zmieniony i usunięty), po prostu śledzi całą zawartość twojego drzewa.
git zachęca do myślenia „całym drzewem”, gdzie wiele systemów kontroli wersji jest bardzo skoncentrowanych na plikach. To dlatego git częściej odwołuje się do „ścieżek” niż do „nazw plików”.
źródło
--follow
to?--follow
bycie domyślnym. Chodzi mi o to, że kiedy chcę zobaczyć historię kodu w pliku, zwykle nie obchodzi mnie, czy plik został zmieniony, czy nie, po prostu chcę zobaczyć historię kodu, niezależnie od zmian. Więc moim zdaniem ma sens--follow
ustawienie domyślne, ponieważ nie obchodzą mnie poszczególne pliki;--follow
pomaga mi zignorować indywidualne zmiany nazw plików, które zwykle nie mają znaczenia.Mam dokładnie ten sam problem, z którym masz do czynienia. Chociaż nie mogę udzielić ci odpowiedzi, myślę, że możesz przeczytać tego e-maila, który Linus napisał w 2005 roku, jest on bardzo trafny i może dać ci wskazówkę, jak rozwiązać problem:
Znalazłem odniesienie do tego posta na blogu, który może być również przydatny w znalezieniu realnego rozwiązania:
Prosimy o informowanie nas o swoich postępach w tej sprawie.
źródło
--color-moved
krok w kierunku tego „idealnego systemu śledzenia”. Bawiłem się nim, aby zobaczyć, jak śledzi przesunięte linie w pliku, ale przypadkowo zdałem sobie sprawę, że śledzi przesunięte linie w całym--follow
może być błędne (np. Jeśli 2 pliki mają tę samą zawartość lub jeśli jest modyfikacja oprócz przenoszenia pliku).Z przyjemnością dowiesz się, że niektóre popularne narzędzia interfejsu użytkownika Git obsługują to teraz. Istnieją dziesiątki narzędzi Git UI, więc nie będę ich wszystkich wymieniać, ale na przykład:
Więcej informacji o narzędziach interfejsu użytkownika Git:
źródło
Uwaga: git 2.9 (czerwiec 2016) poprawi nieco "błędny" charakter
git log --follow
:Zobacz commit ca4e3ca (30 marca 2016) autorstwa SZEDER Gábor (
szeder
) .(Scalone przez Junio C Hamano -
gitster
- w zobowiązaniu 26effb8 , 13 kwietnia 2016 r.)diffcore: napraw kolejność iteracji identycznych plików podczas wykrywania zmiany nazwy
(zwróć uwagę na inwersję tutaj:
B/file -> A/file
iA/file -> B/file
)źródło
W systemie Linux sprawdziłem, że SmartGit i GitEye są w stanie śledzić zmiany nazw podczas śledzenia historii określonego pliku. Jednak w przeciwieństwie do gitk i GitEye, SmartGit pokazuje osobny widok plików i widok repozytorium (który zawiera strukturę katalogów, ale nie zawiera listy plików)
źródło