Использование 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"
Конечно, сценарий фильтра может делать все, что угодно, принимать больше аргументов или что-то еще: есть большая гибкость, помимо того, что я показал здесь.