2013-07-17 8 views
10

Reorganizuję pojedynczy plik skryptowy PHP, aby zadeklarować funkcje i klasy w osobnych plikach. Jak przenieść blok kodu z jednego pliku do innego, zachowując jednocześnie historię Git dla każdej linii? Chciałbym mieć możliwość użycia co najmniej git blame na kodzie. Pomocne będzie również porównanie ze starszymi wersjami.Jak przenieść deklarację funkcji do innego pliku, ale zachować historię Git?

Uwaga: nie interesują mnie rozwiązania typu "obejście", które wymagałoby dodatkowych poleceń lub flag (takich jak --follow) na kodzie, aby wyświetlić jego "starą" historię, dla której osoba przeglądająca historię musiałaby to wiedzieć. plik wymaga specjalnego traktowania. Szukam rozwiązania, które zapisuje niezbędne metadane tak, że normalne polecenia git, takie jak blame, log, diff, i takie "just work" bez przedstawienia dodatkowych flag lub argumentów.

Czytałem dość fewposts szuka rozwiązań similar problems, ale kto by zająć się kwestią git blame na poszczególnych liniach. Jednym z rozwiązań, który moim zdaniem zadziałałby, byłaby copy the file and its entire history, a następnie praca nad tym. Pytanie to pozostaje jednak bez satysfakcjonującej odpowiedzi.

+1

Zauważ, że 'git blame' już śledzi linie kodu pomiędzy plikami, ale jeśli nazwy plików nie zostały zmienione, nadal musisz przekazać dodatkowe opcje, aby Git mógł wykonać wykrywanie ruchu/kopiowania, być może dlatego, że jest to kosztowna operacja. –

+0

Załóżmy, że "Staś" zapisuje blok kodu i sprawdza go w Git, a następnie wycinam i wkleja blok do innego pliku. Teraz 'git winić' pokaże, że napisałem ten blok kodu. Szukam rozwiązania, które pozwoli mi przenieść kod, ale powinno pokazać, że Staś to napisał i kiedy. – dotancohen

+1

Czy przeczytałeś dokumentację ['git blame'] (https://www.kernel.org/pub/software/scm/git/docs/git-blame.html), aby sprawdzić, czy już robi to, czego szukasz dla? –

Odpowiedz

5

Ostrzeżenie: Zakłada się, że akceptuje się rewriting history. Nie używaj tego, chyba że znasz konsekwencje przepisywania historii.

Aby podzielić plik na kilka plików przy zachowaniu wykorzystania Historia git filter-branch:

git filter-branch --tree-filter 'if [ -f original.php ]; then 
    echo part1.php part2.php part3.php | xargs -n 1 cp original.php; fi' HEAD 

następnie usunąć wiersze, które nie mają z każdego pliku (pozostawiając jedynie żądane funkcje i klas) i zobowiązać wynik !

+0

Dziękuję, to jest świetna odpowiedź! – dotancohen

+1

Zauważ, że połączony dokument jest podręcznikiem użytkownika git, nie wiedziałem o tym aż do teraz (chyba ma on mały ranking wyszukiwania lub coś takiego), ale jest bardzo szczegółowy i wydaje się, że będzie naprawdę użyteczny. Staram się unikać "Dzięki!" komentarze, ale naprawdę chciałbym podkreślić, jak ważny jest ten link. Kupiłem całą książkę na Git, a ta strona wciąż zawiera informacje, których nie ma w książce. – jrh

Powiązane problemy