Использование git gui blame
трудно использовать в сценариях, и в то время как git log -G
и git log --pickaxe
может каждый показать вам, когда определение метода появились или исчезли, я не нашел способ сделать их список все изменения сделаны в корпусе вашего метода.
Тем не менее, вы можете использовать gitattributes
и textconv
, чтобы соединить решение, которое делает именно это. Хотя эти функции изначально были предназначены, чтобы помочь вам работать с бинарными файлами, они работают так же хорошо.
Ключ состоит в том, чтобы Git удалил из файла все строки, кроме тех, которые вас интересуют, перед выполнением каких-либо операций diff. Тогда , 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 использовать этот фильтр перед расчетом различия для файла в вопросе.
$ echo "my_file diff=my_filter" >> .gitattributes
Теперь, если вы используете -G.
(обратите внимание на .
) перечислить все коммиты, которые производят видимые изменения при применении вашего фильтра, вы будете иметь именно те коммиты, которые вы заинтересованы. Есть другие варианты которые используют подпрограммы diff Git, такие как --patch
, также получат это ограниченное представление.
$ git log -G. --patch my_file
Voilà!
Одно из полезных улучшений, которое вы, возможно, захотите сделать, - это чтобы ваш сценарий фильтра принял имя метода в качестве его первого аргумента (а второй - файла). Это позволяет вам указать новый интересующий метод, просто позвонив по номеру git config
, вместо того, чтобы редактировать свой скрипт. Например, вы можете сказать:
$ git config diff.my_filter.textconv "/path/to/my_command other_func"
Конечно, сценарий фильтр может делать все, что вам нравится, возьмите больше аргументов, или любой другой: есть много гибкости за то, что я показал здесь.
Я видел такую функциональность в предложении Git GSoG. –
Это предложение, о котором вы говорили? http://lists-archives.org/git/715169-gsoc-draft-proposal-line-level-history-browser.html –
Возможный дубликат [Получить журнал фиксации для определенной строки в файле?] (http: //stackoverflow.com/questions/8435343/retrieve-the-commit-log-for-a-specific-line-in-a-file) – lpapp