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:
… Twierdzę, że każdy SCM, który próbuje śledzić zmiany nazw, jest zasadniczo zepsuty, chyba że robi to z przyczyn wewnętrznych (tj. W celu umożliwienia efektywnych delt), dokładnie dlatego, że zmiany nazw nie mają znaczenia. Oni nie pomóc, a nie są one co byli zainteresowani w każdym razie .
Liczy się znalezienie „skąd się to wzięło”, a architektura git robi to naprawdę bardzo dobrze - znacznie lepiej niż cokolwiek innego. …
Znalazłem odniesienie do tego posta na blogu, który może być również przydatny w znalezieniu realnego rozwiązania:
W wiadomości Linus nakreślił, w jaki sposób idealny system śledzenia treści może pozwolić ci dowiedzieć się, w jaki sposób blok kodu przybrał obecny kształt. Zacząłbyś od bieżącego bloku kodu w pliku, cofnął się do historii, aby znaleźć zatwierdzenie, które zmieniło plik. Następnie sprawdzasz zmianę zatwierdzenia, aby zobaczyć, czy interesujący Cię blok kodu jest przez nią modyfikowany, ponieważ zatwierdzenie zmieniające plik może nie dotknąć bloku kodu, który Cię interesuje, ale tylko niektóre inne części plik.
Kiedy stwierdzisz, że przed zatwierdzeniem blok kodu nie istniał w pliku, przyjrzyj się dokładniej zatwierdzeniu. Może się okazać, że jest to jedna z wielu możliwych sytuacji, w tym:
- Zatwierdzenie naprawdę wprowadziło blok kodu. Autorem zmiany był twórca tej fajnej funkcji, na którą polowałeś, jej pochodzenie (lub winny, który wprowadził błąd); lub
- Blok kodu nie istniał w pliku, ale pięć identycznych kopii znajdowało się w różnych plikach, z których wszystkie zniknęły po zatwierdzeniu. Autor zatwierdzenia refaktoryzował zduplikowany kod, wprowadzając pojedynczą funkcję pomocniczą; lub
- (w szczególnym przypadku) Przed zatwierdzeniem plik, który aktualnie zawiera blok interesującego nas kodu, sam nie istniał, ale istniał inny plik o prawie identycznej zawartości, a blok kodu, który Cię interesował, wraz z całą pozostałą zawartością w pliku istniała wtedy, istniała w tym innym pliku. Odeszło po zatwierdzeniu. Autor zatwierdzenia zmienił nazwę pliku, wprowadzając niewielką modyfikację.
W git, najlepsze narzędzie Linusa do śledzenia treści nie istnieje jeszcze w pełni zautomatyzowany sposób. Ale większość ważnych składników jest już dostępna.
Prosimy o informowanie nas o swoich postępach w tej sprawie.
git mv oldfile newfilenie 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.