Jak filtrować git diff na podstawie rozszerzeń plików?

Czy istnieje możliwość ograniczenia git diff do danego zestawu rozszerzeń plików?

Author: Chris Stryczynski, 2011-12-18

10 answers

Tak, jeśli upewnisz się, że git rozszerza glob zamiast powłoki, to będzie pasować na każdym poziomie, więc coś takiego (cudzysłowy są ważne) powinno działać poprawnie.

git diff -- '*.c' '*.h'
 251
Author: CB Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-18 21:33:46

Aby załączyć pliki rekurencyjnie (łącznie z bieżącym katalogiem) zadziałało to dla mnie:

git diff -- '***.py'
 17
Author: Bohumir Zamecnik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-10 11:36:38

Albo użyj globstar powłoki (która wykonuje rekurencyjne wyszukiwanie)1,2:

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

Lub użyj find:

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

Oba są nazwami specjalnymi i znakami odstępów. Chociaż możesz chcieć filtrować katalogi posiadające rozszerzenie. py:)


1 lubię robić git diff -- {.,**}/*.py zazwyczaj

2 gdy globstar jest włączony, git diff -- **/*.py zawiera już ./*.py. Na stronie podręcznika Basha: 'jeśli następuje a/ , dwa sąsiadujące * s będą pasowały tylko do katalogów i podkatalogi.'

 8
Author: sehe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-09 15:17:34

Dla prostych wzorców plików wydaje się to działać:

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

Białe znaki są bezpieczne i możesz mieć wiele rozszerzeń:

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff
 4
Author: Mat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-18 21:27:01

Argument wiersza poleceń dla rozszerzenia.

git diff *.py

W alternatywie, możesz przełożyć find na git diff:

find . -name '*.py' -type f | git diff --
 3
Author: hughdbrown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-18 23:29:54

Jak przetestowano na git w wersji 2.18.0, rozszerzenie pliku powinno być cytowane podwójnymi cudzysłowami. Jeśli chcesz znaleźć Ostatnie różnice między lokalnym repozytorium a zdalnym, po wyciągnięciu możesz użyć:

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

Na przykład:

git diff master@{1} origin/master --name-only "*.cs"
 2
Author: marjan.javid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-01-27 13:21:31

Żadna z powyższych odpowiedzi nie działa dla mnie pod git bash w systemie Windows. Nie jestem pewien, czy chodzi o wersję (używam 1.8.4) czy o Windows / bash; również, w moim przypadku, chciałem rozróżnić dwie gałęzie, w których każda gałąź miała dodatkowe pliki nie obecne w drugiej gałęzi (stąd te oparte na 'find' są niedbałe).

W każdym razie zadziałało mi to (w moim przykładzie szukanie różnic między plikami Pythona):

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`
 0
Author: Yonatan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-08 17:25:48

git diff pokazuje tylko różnice w nieakstragowanych plikach.

Znalazłem to pytanie, ponieważ chciałem wykluczyć .info pliki z git diff. Udało mi się to osiągnąć poprzez umieszczenie go za pomocą git add *.info, co zmniejsza ilość pozostawionych plików.

 0
Author: Alan Whitelaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-14 10:46:24

Skończyłem z tym:

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

Wyświetla diffs dla podanego commita tylko jeśli nazwa pliku zawiera słowo 'test' (wielkość liter jest niewrażliwa na wielkość liter) i nie kończy się na .sql, zmodyfikuj potok tak, jak jest to konieczne dla Twojego przypadku.

 0
Author: MatrixManAtYrService,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-06 21:04:14

Uwaga, że params kolejność robi różnicę...na przykład:

git diff master --name-only --relative -- "**/*.ts" "**/*.tsx" "**/*.js" "**/*.jsx" "**/*.vue"

'diff' musi być poprzedzone 'master'

 0
Author: Revenant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-20 07:04:02