Какую опцию следует использовать, чтобы ограничить git diff данным набором расширений файлов?


есть ли возможность ограничить git diff к заданному набору расширений файлов?

8 106

8 ответов:

да, если вы гарантируете, что git расширяет глобус, а не вашу оболочку, то он будет соответствовать на любом уровне, поэтому что-то вроде этого (кавычки важны) должно работать нормально.

git diff -- '*.c' '*.h'

либо использовать globstar вашей оболочки (который делает рекурсивный поиск)1,2:

shopt -s globstar 
git diff -- *.py **/*.py

или использовать find:

find -name '*.py' -print0 | xargs -0 git diff --

оба они являются специальными именами и доказательством пробелов. Хотя вы, возможно, захотите, чтобы фильтровать для каталогов, имеющих .расширение пы :)


1 Мне нравится делать git diff -- {.,**}/*.py обычно

2, Когда globstar включен, git diff -- **/*.py уже включает в себя ./*.py. На странице Баша: 'если после A/, два соседних *S будут соответствовать только каталогам и подкаталогам.-

для рекурсивного включения файлов (включая текущий dir) это сработало для меня:

git diff -- '***.py'

для простых шаблонов файлов, это, кажется, работает:

$ git ls-files -zm '*.txt' | xargs --null git diff

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

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff

аргумент командной строки для расширения.

git diff *.py

в альтернативе, вы можете трубить find на git diff:

find . -name '*.py' -type f | git diff --

ни один из ответов выше, кажется, не работает для меня под git bash на Windows. Я не уверен, что это версия (я использую 1.8.4) или Windows/bash thing; также, в моем случае, я хотел различать две ветви, где каждая ветвь имела дополнительные файлы, не присутствующие в другой ветви (таким образом, "найти" на основе них-это упущение).

в любом случае это сработало для меня (в моем примере, ища разницу между файлами python):

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`

git diff будет показывать только различия в файлах проиндексированы.

Я нашел этот вопрос, потому что я хотел исключить .info файлы git diff. Я достиг этого, поставив его с git add *.info, что уменьшает количество файлов слева.

Я закончил с этим:

commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --

это показывает различия для указанной фиксации только в том случае, если имя файла содержит слово "test" (без учета регистра) и не заканчивается на .sql изменить трубопровода по мере необходимости для вашего случая.