Odpowiedzi:
Tak, jeśli upewnisz się, że git rozszerza glob, a nie twoją powłokę, będzie pasował na każdym poziomie, więc coś takiego (cudzysłowy są ważne) powinno działać dobrze.
git diff -- '*.c' '*.h'
git diff -- *.{c,h,etc}
git diff master HEAD -- "*filename.txt"
przydatna jest równieżgit diff master HEAD --name-only
''
) są również ważne! git diff -- src/*.js
powinno byćgit diff -- 'src/*.js'
Aby dołączyć pliki rekurencyjnie (w tym bieżący katalog), działało to dla mnie:
git diff -- '***.py'
git diff -- '***.py' ':!.Trashes'
Albo użyj globstar twojej powłoki (który wykonuje wyszukiwanie rekurencyjne) 1 , 2 :
shopt -s globstar
git diff -- *.py **/*.py
lub użyj znajdź:
find -name '*.py' -print0 | xargs -0 git diff --
Oba są nazwami specjalnymi i dowodami białych znaków. Chociaż możesz chcieć filtrować w poszukiwaniu katalogów z rozszerzeniem .py :)
1 git diff -- {.,**}/*.py
Zwykle lubię to robić
2 Gdy globstar jest włączony, git diff -- **/*.py
zawiera już ./*.py
. Na stronie podręcznika Basha: 'Jeśli następuje po nim /, dwa sąsiednie * s będą pasować tylko do katalogów i podkatalogów.'
Argument wiersza poleceń dla rozszerzenia.
git diff *.py
Alternatywnie możesz przejść find
do git diff
:
find . -name '*.py' -type f | git diff --
git diff *.py
krzyczącymi nagłówkami i bez nich
Zgodnie z testami na git w wersji 2.18.0, rozszerzenie pliku powinno być cytowane w cudzysłowie. Jeśli chcesz znaleźć ostatnie różnice między repozytorium lokalnym a zdalnym, po ścią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"
git diff master@{1} origin/master --name-only -- "*.cs"
Żadna z powyższych odpowiedzi nie wydaje się działać dla mnie w git bash
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 porównać dwie gałęzie, w których każda gałąź miała dodatkowe pliki, których nie było w drugiej gałęzi (stąd te oparte na „znalezieniu” są niedopuszczalne).
W każdym razie zadziałało to dla mnie (w moim przykładzie szukanie różnicy między plikami Pythona):
git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`
git diff
pokaże tylko różnice w plikach niestacjonarnych.
Znalazłem to pytanie, ponieważ chciałem wykluczyć .info
pliki z git diff
. Osiągnąłem to, ustawiając go za pomocą git add *.info
, co zmniejsza liczbę pozostałych plików.
Skończyło się na tym:
commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --
Pokazuje różnice dla określonego zatwierdzenia tylko wtedy, gdy nazwa pliku zawiera słowo „test” (bez rozróżniania wielkości liter) i nie kończy się na .sql
, zmodyfikuj potok zgodnie z potrzebą.