Как фильтровать git diff по расширениям файлов?

152

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

vfclists
источник

Ответы:

227

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

git diff -- '*.c' '*.h'
CB Bailey
источник
1
Хорошо, моя версия Git была слишком старой. Работает как рекламируется с 1.7.8. Превосходно.
Мат
3
Мой работал с расширением скобки, а-ляgit diff -- *.{c,h,etc}
Мэтт Флетчер
9
двойная черта важна, например. git diff master HEAD -- "*filename.txt"также полезноgit diff master HEAD --name-only
neaumusic
Одинарные кавычки ( '') также важны! git diff -- src/*.jsдолжно бытьgit diff -- 'src/*.js'
Nickofthyme
1
Также необходимо сделать это в корневом каталоге репозитория git.
Джон Цзян
10

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

git diff -- '***.py'
Богумир Замецник
источник
1
Для меня это лучшее решение. Вы также можете исключить некоторые файлы / каталоги. Например:git diff -- '***.py' ':!.Trashes'
Бартош
Что делают тройные звездочки (по сравнению с одной звездочкой)?
Янн Поппинга
IIRC двойная звездочка означает (возможно) вложенные каталоги (даже пустые), а одиночная звездочка и .py означают имя файла. Так что это должен быть файл * .py в текущем или любом вложенном каталоге.
Богумир Замецник
8

Либо используйте 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: «Если после / / два соседних * будут соответствовать только каталогам и подкаталогам».

sehe
источник
4

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

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

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

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff
Мат
источник
3

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

git diff *.py

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

find . -name '*.py' -type f | git diff --
hughdbrown
источник
пожалуйста, сделайте ответ немного более читабельным. Вы могли бы быть достаточно с git diff *.pyи без кричащих заголовков
сехе
1
«Кричащие заголовки» были # -комментариями в сценарии оболочки.
hughdbrown
Это единственное решение, которое работало для меня, кавычки (и т. Д.) Не работали в командной строке Windows.
Эд Байятес
1

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

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

Например:

git diff master@{1} origin/master --name-only "*.cs"
marjan.javid
источник
1
Это сработало для меня, когда я предоставил - до продления, как это,git diff master@{1} origin/master --name-only -- "*.cs"
333
0

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

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

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`
Йонатан
источник
Этот stackoverflow.com/a/8554987/4233229 работает, но для Windows нужно использовать двойные кавычки вместо одинарных
lcnittl
0

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

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

Алан Уайтлоу
источник
0

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

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

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

MatrixManAtYrService
источник