Bagaimana cara memfilter git berdasarkan ekstensi file?

152

Apakah ada opsi untuk membatasi git diffke satu set ekstensi file yang diberikan?

vfclists
sumber

Jawaban:

227

Ya, jika Anda memastikan bahwa git memperluas bola daripada shell Anda maka itu akan cocok pada tingkat apa pun sehingga sesuatu seperti ini (kutipan penting) harus bekerja dengan baik.

git diff -- '*.c' '*.h'
CB Bailey
sumber
1
Ok, versi git saya terlalu tua. Bekerja seperti yang diiklankan dengan 1.7.8. Luar biasa.
Mat
3
Milik saya bekerja dengan ekspansi brace, agit diff -- *.{c,h,etc}
Matt Fletcher
9
dasbor ganda misalnya penting. git diff master HEAD -- "*filename.txt"juga berguna adalahgit diff master HEAD --name-only
neaumus
Kutipan tunggal ( '') juga penting! git diff -- src/*.jsseharusnyagit diff -- 'src/*.js'
Nickofthyme
1
Juga harus melakukan ini di direktori root dari repositori git.
John Jiang
10

Untuk memasukkan file secara rekursif (termasuk direktori saat ini) ini berhasil bagi saya:

git diff -- '***.py'
Bohumir Zamecnik
sumber
1
Bagi saya itu adalah solusi terbaik. Anda juga dapat mengecualikan beberapa file / direktori. Sebagai contoh:git diff -- '***.py' ':!.Trashes'
Bartosz
Apa yang dilakukan tiga tanda bintang (dibandingkan dengan tanda bintang tunggal)?
Jann Poppinga
IIRC tanda bintang ganda berarti (mungkin) direktori bersarang (bahkan kosong) dan tanda bintang tunggal dan .py berarti nama file. Jadi itu harus file * .py di direktori saat ini atau bersarang.
Bohumir Zamecnik
8

Gunakan globstar shell Anda (yang melakukan pencarian rekursif) 1 , 2 :

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

atau gunakan find:

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

Keduanya adalah nama-khusus dan bukti spasi putih. Meskipun Anda mungkin ingin memfilter untuk direktori yang memiliki ekstensi .py :)


1 Saya suka melakukan git diff -- {.,**}/*.pybiasanya

2 Ketika globstar diaktifkan, git diff -- **/*.pysudah termasuk ./*.py. Di manual Bash: 'Jika diikuti oleh a /, dua * yang berdekatan hanya akan cocok dengan direktori dan subdirektori.'

lihat
sumber
4

Untuk pola file sederhana, ini tampaknya berfungsi:

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

Aman spasi putih, dan Anda juga dapat memiliki beberapa ekstensi:

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

Argumen baris perintah untuk ekstensi.

git diff *.py

Sebagai alternatif, Anda dapat menyalurkan findke git diff:

find . -name '*.py' -type f | git diff --
hughdbrown
sumber
tolong buat jawabannya sedikit lebih mudah dibaca. Anda bisa mencukupi dengan git diff *.pydan tanpa judul berteriak
sehe
1
'Judul teriakan' adalah # -comments dalam skrip shell.
hughdbrown
Ini adalah satu-satunya solusi yang bekerja untuk saya, tanda kutip (dll.) Tidak berfungsi pada command prompt Windows.
Ed Bayiates
1

Seperti yang diuji pada git versi 2.18.0, ekstensi file harus dikutip dengan tanda kutip ganda. Jika Anda ingin menemukan perbedaan terakhir antara repositori lokal Anda dan yang jauh, setelah menarik, Anda dapat menggunakan:

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

Sebagai contoh:

git diff master@{1} origin/master --name-only "*.cs"
marjan.javid
sumber
1
Itu bekerja untuk saya ketika saya memberikan - sebelum perpanjangan, seperti ini,git diff master@{1} origin/master --name-only -- "*.cs"
333
0

Tidak ada satu pun jawaban di atas yang berfungsi untuk saya git bashdi Windows. Saya tidak yakin apakah itu versi (saya menggunakan 1.8.4) atau Windows / bash; juga, dalam kasus saya, saya ingin membedakan dua cabang di mana setiap cabang memiliki file tambahan yang tidak ada di cabang lain (sehingga yang berbasis 'menemukan' lalai).

Bagaimanapun ini bekerja untuk saya (dalam contoh saya, mencari perbedaan antara file python):

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`
Yonatan
sumber
Ini stackoverflow.com/a/8554987/4233229 karya, tapi kita harus menggunakan tanda kutip ganda bukannya tunggal untuk Windows
lcnittl
0

git diff hanya akan menunjukkan perbedaan pada file yang tidak dipentaskan.

Saya menemukan pertanyaan ini karena saya ingin mengecualikan .infofile dari git diff. Saya mencapai ini dengan mementaskannya git add *.info, yang mengurangi file yang tersisa.

Alan Whitelaw
sumber
0

Saya berakhir dengan ini:

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

Ini menunjukkan perbedaan untuk komit yang ditentukan hanya jika nama file berisi kata 'test' (case-sensitive) dan tidak diakhiri dengan .sql, modifikasi pipeline yang diperlukan untuk case Anda.

MatrixManAtYrService
sumber