Korzystanie git gui blame
jest trudne do wykorzystania w skryptach, a jednocześnie git log -G
i git log --pickaxe
każdy może pokazać, kiedy pojawiła się definicja metoda lub zniknął, nie znalazłem żadnego sposobu, aby je wymienić wszystkie zmiany dokonane w ciele swojej metody.
Możesz jednak użyć gitattributes
i textconv
właściwości, aby złożyć w całość rozwiązanie, które właśnie to robi. Chociaż te funkcje były pierwotnie przeznaczone do pomocy w pracy z plikami binarnymi, działają tutaj równie dobrze.
Kluczem jest to, aby Git usunął z pliku wszystkie linie z wyjątkiem tych, którymi jesteś zainteresowany, przed wykonaniem jakichkolwiek operacji porównywania. Następnie git log
, git diff
itp będą widzieć tylko obszar, który Cię interesuje.
Oto zarys tego, co robię w innym języku; możesz go dostosować do własnych potrzeb.
Napisz krótki skrypt powłoki (lub inny program), który pobiera jeden argument - nazwę pliku źródłowego - i wyświetla tylko interesującą część tego pliku (lub nic, jeśli żaden z nich nie jest interesujący). Na przykład możesz użyć sed
w następujący sposób:
#!/bin/sh
sed -n -e '/^int my_func(/,/^}/ p' "$1"
Zdefiniuj textconv
filtr Git dla nowego skryptu. (Zobacz gitattributes
stronę podręcznika po więcej szczegółów.) Nazwa filtru i lokalizacja polecenia mogą być dowolne.
$ git config diff.my_filter.textconv /path/to/my_script
Powiedz Gitowi, aby użył tego filtru przed obliczeniem różnic dla danego pliku.
$ echo "my_file diff=my_filter" >> .gitattributes
Teraz, jeśli używasz -G.
(uwaga .
) notować wszystkie rewizje, które wywołują widocznych zmian, gdy filtr jest stosowany, trzeba będzie dokładnie te rewizje, że jesteś zainteresowany. Wszelkie inne opcje, które wykorzystują procedury diff git, takich jak --patch
, będzie również ten ograniczony widok.
$ git log -G. --patch my_file
Voilà!
Jednym z przydatnych ulepszeń, które możesz chcieć zrobić, jest ustawienie przez skrypt filtru nazwy metody jako pierwszego argumentu (i pliku jako drugiego). Pozwala to określić nową interesującą metodę tylko przez wywołanie git config
, zamiast konieczności edytowania skryptu. Na przykład możesz powiedzieć:
$ git config diff.my_filter.textconv "/path/to/my_command other_func"
Oczywiście skrypt filtrujący może robić, co chcesz, przyjmować więcej argumentów lub cokolwiek: poza tym, co tutaj pokazałem, jest dużo elastyczności.