Использование git gui blame
сложно использовать в сценариях, и хотя git log -G
и git log --pickaxe
каждый может показать вам, когда определение метода появилось или исчезло, я не нашел способа заставить их перечислить все изменения сделано для тела вашего метода.
Однако вы можете использовать gitattributes
и свойство textconv
, чтобы собрать решение, которое именно это и делает. Хотя эти функции изначально были предназначены для того, чтобы помочь вам работать с двоичными файлами, они работают и здесь.
Ключ состоит в том, чтобы Git удалял из файла все строки, кроме тех, которые вас интересуют, перед выполнением любых операций сравнения. Тогда git log
, git diff
и т. Д. Увидят только интересующую вас область.
Вот схема того, что я делаю на другом языке; Вы можете настроить его для своих собственных нужд.
Напишите короткий сценарий оболочки (или другую программу), который принимает один аргумент - имя исходного файла - и выводит только интересную часть этого файла (или ничего, если ни один из них не интересен). Например, вы можете использовать sed
следующим образом:
#!/bin/sh
sed -n -e '/^int my_func(/,/^}/ p' "$1"
Определите фильтр Git textconv
для вашего нового скрипта. (Для получения дополнительной информации см. Справочную страницу gitattributes
.) Имя фильтра и расположение команды могут быть любыми.
$ git config diff.my_filter.textconv /path/to/my_script
Скажите Git использовать этот фильтр перед вычислением diff для рассматриваемого файла.
$ echo "my_file diff=my_filter" >> .gitattributes
Теперь, если вы используете -G.
(обратите внимание на .
), чтобы перечислить все коммиты, которые приводят к видимым изменениям при применении вашего фильтра, у вас будут именно те коммиты, которые вас интересуют. Любой другие опции, использующие процедуры сравнения Git, такие как --patch
, также получат это ограниченное представление.
$ git log -G. --patch my_file
Вуаля!
Одно полезное улучшение, которое вы можете сделать, - это чтобы ваш сценарий фильтра принимал имя метода в качестве первого аргумента (а файл - в качестве второго). Это позволяет вам указать новый интересующий вас метод, просто вызвав git config
, а не редактировать скрипт. Например, вы можете сказать:
$ git config diff.my_filter.textconv "/path/to/my_command other_func"
Конечно, скрипт фильтра может делать все что угодно, принимать больше аргументов или что-то еще: есть большая гибкость, помимо того, что я здесь показал.