Bagaimana cara memfilter git berdasarkan ekstensi file?


152

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

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'

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'

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


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

3

Argumen baris perintah untuk ekstensi.

git diff *.py

Sebagai alternatif, Anda dapat menyalurkan findke git diff:

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

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"

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`

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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.