Як відфільтрувати git diff на основі розширень файлів?


152

Чи є можливість обмежитися git diffпевним набором розширень файлів?

Відповіді:


227

Так, якщо ви переконаєтесь, що git розширює глобус, а не оболонку, то він відповідатиме на будь-якому рівні, тому щось подібне (цитати важливі) має працювати добре.

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

1
Гаразд, моя версія git була занадто стара. Працює як рекламується з 1.7.8. Відмінно.
Мат

3
Шахта працювала з розширенням дужок, а-ляgit diff -- *.{c,h,etc}
Метт Флетчер

9
подвійний тире є важливим, наприклад. git diff master HEAD -- "*filename.txt"також корисноgit diff master HEAD --name-only
неавмузний

Одиночні лапки ( '') також важливі! git diff -- src/*.jsповинно бутиgit diff -- 'src/*.js'
Нікофтіме

1
Також потрібно зробити це в кореневому каталозі сховища git.
Джон Цзян

10

Щоб включити файли рекурсивно (включаючи поточний dir), це працювало для мене:

git diff -- '***.py'

1
Для мене це найкраще рішення. Ви також можете виключити деякі файли / каталоги. Наприклад:git diff -- '***.py' ':!.Trashes'
Бартош

Що роблять потрійні зірочки (порівняно з одиничною зірочкою)?
Янн Поппінга

IIRC подвійна зірочка означає (можливо) вкладені каталоги (навіть порожні), а одна зірочка та .py означає ім'я файлу. Отже, це повинен бути * .py файл у поточному або будь-якому вкладеному каталозі.
Богумір Замечник

8

Або скористайтеся глобальною версією вашої оболонки (що робить рекурсивний пошук) 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. На сторінці сторінки Баша: "Якщо слідує a /, два суміжні * s будуть відповідати лише каталогів і підкаталогів."


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 --

будь ласка, зробіть відповідь трохи читабельнішою. Ви могли б достатись 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"

1
Це працювало для мене, коли я передбачив - перед розширенням, як це,git diff master@{1} origin/master --name-only -- "*.cs"
333

0

Жоден із наведених вище відповідей, здається, не працює для мене в git bashWindows. Я не впевнений, чи це версія версії (я використовую 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 --

Це показує різницю для зазначеної фіксації, лише якщо ім'я файлу містить слово 'test' (нечутливий до регістру) і не закінчується .sql, модифікуйте конвеєр, як це необхідно для вашого випадку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.