Використання 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 diff, такі як --patch
, буде також отримати цей обмежений вигляд.
$ git log -G. --patch my_file
Вуаля!
Одним корисним покращенням, яке ви можете зробити, є те, що сценарій фільтра приймає ім'я методу як перший аргумент (а файл як другий). Це дозволяє вказати новий метод, що цікавить, лише зателефонувавшиgit config
, а не редагуючи сценарій. Наприклад, ви можете сказати:
$ git config diff.my_filter.textconv "/path/to/my_command other_func"
Звичайно, сценарій фільтру може робити все, що вам подобається, брати більше аргументів або що завгодно: є багато гнучкості, ніж те, що я показав тут.