Git diff dosya uzantılarına göre nasıl filtrelenir?


153

git diffBelirli bir dosya uzantısı kümesiyle kısıtlama seçeneği var mı ?

Yanıtlar:


229

Evet, git'in kabuğunuzdan ziyade bir küreyi genişlettiğinden emin olursanız, herhangi bir seviyede eşleşir, böylece böyle bir şey (tırnaklar önemlidir) iyi çalışmalıdır.

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

1
Tamam, git versiyonum çok eski. 1.7.8 ile ilan edildiği gibi çalışır. Mükemmel.
Mat

3
Benimki ayracı genişletme ile çalıştı, lagit diff -- *.{c,h,etc}
Matt Fletcher

9
çift ​​çizgi önemlidir örn. git diff master HEAD -- "*filename.txt"Ayrıca yararlıgit diff master HEAD --name-only
neaumusic

Tek tırnak ( '') da önemlidir! git diff -- src/*.jsolmalıgit diff -- 'src/*.js'
Nickofthyme

1
Bunu git deposunun kök dizininde de yapmalısınız.
John Jiang

10

Dosyaları özyinelemeli olarak (geçerli dir dahil) dahil etmek benim için çalıştı:

git diff -- '***.py'

1
Benim için en iyi çözüm bu. Bazı dosyaları / dizinleri de hariç tutabilirsiniz. Örneğin:git diff -- '***.py' ':!.Trashes'
Bartosz

Üçlü yıldız işaretleri (tek yıldız işaretiyle karşılaştırıldığında) ne yapar?
Jann Poppinga

IIRC çift yıldız işareti (muhtemelen) iç içe geçmiş dizinler (boş olsa bile) ve tek yıldız işareti ve .py dosya adı anlamına gelir. Bu nedenle, geçerli veya iç içe dizindeki bir * .py dosyası olmalıdır.
Bohumir Zamecnik

8

Ya kabuğunuzun globstarını kullanın (özyinelemeli arama yapar) 1 , 2 :

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

veya find komutunu kullanın:

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

Bunların her ikisi de özel isimler ve boşluklara dayanıklıdır. .Py uzantılı dizinleri filtrelemek isteseniz de :)


1 git diff -- {.,**}/*.pyGenellikle yapmayı severim

2 Globstar etkinleştirildiğinde, git diff -- **/*.pyzaten içerir ./*.py. Bash manpageinde: '/ / ile takip edilirse, bitişik iki * yalnızca dizinlerle ve alt dizinlerle eşleşir.'


4

Basit dosya desenleri için bu işe yarıyor gibi görünüyor:

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

Boş alan güvenli ve birden fazla uzantınız da olabilir:

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff

3

Uzantı için komut satırı bağımsız değişkeni.

git diff *.py

Alternatif olarak, aşağıdakilere boru findoluşturabilirsiniz git diff:

find . -name '*.py' -type f | git diff --

lütfen cevabı biraz daha okunaklı yapın. Sen ile yeterliydi olabilirdi git diff *.pyve bağırarak başlıkları olmadan
sehe

1
'Not başlıkları' bir kabuk betiğindeki # seçimdir.
hughdbrown

Bu benim için çalışan tek çözüm, tırnak (vb) Windows komut isteminde çalışmadı.
Ed Bayiates

1

Git sürüm 2.18.0'da test edildiği gibi, dosya uzantısı çift tırnak içine alınmalıdır. Yerel deponuzla uzak deponuz arasındaki son farkları bulmak istiyorsanız, çektikten sonra şunları kullanabilirsiniz:

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

Örneğin:

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

1
Sağladığım zaman benim için çalıştı - uzantıdan önce, böyle,git diff master@{1} origin/master --name-only -- "*.cs"
333

0

Yukarıdaki cevapların hiçbiri git bashWindows altında benim için çalışmıyor gibi görünüyor . Bir sürüm şey (1.8.4 kullanıyorum) veya Windows / bash şey olup olmadığından emin değilim; ayrıca, benim durumumda, her dalın diğer dalda bulunmayan ek dosyaları olduğu iki dalı ayırmak istedim.

Neyse bu benim için çalıştı (benim örneğimde, python dosyaları arasında bir fark arıyor):

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

Bu stackoverflow.com/a/8554987/4233229 işe yarıyor, ancak Windows için tek yerine çift tırnak kullanmak zorunda
lcnittl

0

git diff yalnızca etiketlenmemiş dosyalarda farklılıklar gösterir.

Bu soruyu buldum çünkü .infodosyaları hariç tutmak istedim git diff. Bunu evreleme ile başardım git add *.info, bu da kalan dosyaları azaltır.


0

Bununla yaralandım:

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

Bu, yalnızca dosya adı 'test' (büyük / küçük harf duyarsız) kelimesini içeriyorsa ve bitmiyorsa .sql, boru hattını durumunuz için gerektiği şekilde değiştirin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.