Как отфильтровать git diff по расширениям файлов? - PullRequest
119 голосов
/ 19 декабря 2011

Можно ли ограничить git diff определенным набором расширений файлов?

Ответы [ 9 ]

181 голосов
/ 19 декабря 2011

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

git diff -- '*.c' '*.h'
8 голосов
/ 19 декабря 2011

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

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

или используйте находку:

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

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


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

2 Когда включен globstar, git diff -- **/*.py уже включает ./*.py. На странице руководства Bash: «Если после / / два соседних * будут соответствовать только каталогам и подкаталогам.»

6 голосов
/ 10 августа 2018

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

git diff -- '***.py'
1 голос
/ 19 декабря 2011

Для простых шаблонов файлов это работает:

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

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

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff
1 голос
/ 19 декабря 2011

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

git diff *.py

В альтернативном варианте вы можете передать find в git diff:

find . -name '*.py' -type f | git diff --
0 голосов
/ 02 ноября 2018

Как я тестировал на git версии 2.18.0, мы должны написать расширение файла между двойными кавычками. Если вы хотите найти последние отличия между локальным и удаленным хранилищем, после извлечения вы можете написать его так:

git diff YourBranchName@{1} YourBranchName --name-only "*.YourFileExtionsion"

Например:

git diff master@{1} origin/master --name-only "*.cs"

0 голосов
/ 07 апреля 2018

Я завелся с этим:

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

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

0 голосов
/ 14 сентября 2015

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

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

0 голосов
/ 08 ноября 2014

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

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

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