Использование 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"
Определите textconvфильтр Git для вашего нового скрипта. (См. Дополнительную информацию на gitattributesстранице руководства .) Имя фильтра и расположение команды могут быть любыми, как вам угодно.
$ git config diff.my_filter.textconv /path/to/my_script
Скажите Git использовать этот фильтр перед вычислением различий для рассматриваемого файла.
$ 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"
Конечно, сценарий фильтра может делать все, что угодно, принимать больше аргументов или что-то еще: есть большая гибкость, помимо того, что я показал здесь.