Предел Git Разница с одной или несколькими функциями?

Я установил *.py diff=python в .git/info/attributes. Итак, Git знает, где границы функций. Git diff -W может даже убедиться, что показана вся функция.

Но есть ли способ ограничить вывод Git diff только определенной функцией (или более чем одной)?

(В противном случае, я думаю, это awk...)

EDIT. Это также было бы полезно для git log и git rev-list: не показывать мне каждую фиксацию, которая изменяет views.py, покажите мне, что коммиты, которые изменяют в ней определенную функцию. (Да, в идеальном мире view.py не будет behemoth линии 2000, часто изменяемой 8 различными разработчиками...)

Ответ 1

Хорошо, спасибо Birei, у нас есть решение.

Используйте awk script в этом ответе в сочетании с небольшим количеством bash:

~/scripts/grit:

#!/bin/bash
cmd=$1
shift 1
if [ "$cmd" = "" ]; then
  git
# other commands not relevant to this question go here
elif [ $cmd = "funcdiff" ]; then
  git show "$1:$3" | awk -f ~/scripts/getfunc.awk -v f=$4 > /tmp/.tmp1
  git show "$2:$3" | awk -f ~/scripts/getfunc.awk -v f=$4 > /tmp/.tmp2
  git diff -W --no-index /tmp/.tmp1 /tmp/.tmp2 

else
  git $cmd [email protected]
fi

Пример использования: grit funcdiff 009e75 8b7a14 ./staging.py write_uploaded

Это также можно добавить как псевдоним git в ~/.gitconfig

Ответ 2

Я не нашел другого параметра (кроме уже упомянутого короткого параметра --function-context или его -W), который мог бы ограничить вывод diff одной единственной функцией.

И даже этот параметр -W не всегда достаточно, зная, что "функция" может сильно варьироваться от языка к языку, как показано в этом сообщение в блоге:

Ive нашел этот вариант довольно ненадежным, по крайней мере, в рамках большого класса PHP.
Мои тесты, найденные --function-context, часто приводят к отображению почти всех исходных файлов, а git не знает границ функций PHP.
Количество строк контекста до и после изменения кажется случайным, и diff не обязательно всегда показывает все строки функции.

оригинальное сообщение об ошибке, которое ввело это изменение, проливает некоторый свет:

Эта реализация имеет тот же недостаток, что и в grep, а именно, что нет возможности явно найти конец функции.   Это означает, что показаны несколько строк дополнительного контекста, начиная с следующей распознанной функции.

Таким образом, обнаружение границ функций затруднено для git.
Кажется, в этом случае git никогда не обнаруживает границу функции и не дает нам контекст всего файла.


Как указывает Стив Стив Беннетт, потенциальным решением было бы определить псевдоним git, который будет извлекать функцию в ревизии до и после модификации, чтобы разделить эти 2-временные файлы.
Пример в Создание git Псевдонимы "и" Bash script, чтобы выбрать одна функция Python из файла ".

Это ad-hoc решение, которое сможет анализировать определенный тип источника, с которым OP работает в своем репо.