Предел 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 работает в своем репо.