Ini diimplementasikan sekarang (git 1.9 / 2.0, Q1 2014) dengan pengenalan pathspec magic :(exclude)dan bentuk singkatnya:! di commit ef79b1f dan commit 1649612 , oleh
Nguyễn Thái Ngọc Duy ( pclouds) , dokumentasi dapat ditemukan di sini .
Anda sekarang dapat mencatat semuanya kecuali konten sub-folder:
git log -- . ":(exclude)sub"
git log -- . ":!sub"
Atau Anda dapat mengecualikan elemen tertentu dalam sub-folder itu
file tertentu:
git log -- . ":(exclude)sub/sub/file"
git log -- . ":!sub/sub/file"
file apa pun yang diberikan di dalam sub:
git log -- . ":(exclude)sub/*file"
git log -- . ":!sub/*file"
git log -- . ":(exclude,glob)sub/*/file"
Anda dapat membuat pengecualian itu tidak peka huruf besar kecil!
git log -- . ":(exclude,icase)SUB"
Seperti yang dicatat Kenny Evitt
Jika Anda menjalankan Git di shell Bash, gunakan ':!sub'atau ":\!sub"sebagai gantinya untuk menghindari bash: ... event not foundkesalahan
Catatan: Git 2.13 (Q2 2017) akan menambahkan sinonim ^ke!
Lihat commit 859b7f1 , commit 42ebeb9 (08 Feb 2017) oleh Linus Torvalds ( torvalds) .
(Digabung oleh Junio C Hamano - gitster- di commit 015fba3 , 27 Feb 2017)
pathspec magic: tambahkan ' ^' sebagai alias untuk ' !'
Pilihan ' !' untuk pathspec negatif akhirnya tidak hanya tidak cocok dengan apa yang kami lakukan untuk revisi, itu juga karakter yang mengerikan untuk ekspansi shell karena perlu kutipan.
Jadi tambahkan ' ^' sebagai alias alternatif untuk entri pathspec yang tidak termasuk.
Perhatikan bahwa, sebelum Git 2.28 (Q3 2020), penggunaan pathspec negatif, saat mengumpulkan path termasuk yang tidak terlacak di pohon kerja, telah rusak.
Lihat commit f1f061e (05 Jun 2020) oleh Elijah Newren ( newren) .
(Digabung oleh Junio C Hamano - gitster- di commit 64efa11 , 18 Jun 2020)
dir: memperbaiki pengobatan pathspec yang dinegasikan
Dilaporkan oleh: John Millikin
Ditandatangani oleh: Elijah Newren
do_match_pathspec()memulai hidup sebagai match_pathspec_depth_1()dan untuk kebenaran hanya seharusnya dipanggil dari match_pathspec_depth(). match_pathspec_depth()kemudian diubah namanya menjadi match_pathspec(), sehingga kemungkinan yang kami harapkan saat ini adalah do_match_pathspec()tidak ada penelepon langsung di luar match_pathspec().
Sayangnya, niat ini hilang dengan penggantian nama kedua fungsi tersebut, dan panggilan tambahan ke do_match_pathspec()telah ditambahkan di commit 75a6315f74 (" ls-files: add pathspec matching for submodules", 2016-10-07, Git v2.11.0-rc0 - merge terdaftar di batch # 11 ) dan 89a1f4aaf7 (" dir: jika pathspec kami mungkin cocok dengan file di bawah dir, rekurse ke dalamnya", 2019-09-17, Git v2.24.0-rc0).
Tentu saja, do_match_pathspec()memiliki keuntungan penting match_pathspec()- match_pathspec()akankah hardcode menandai salah satu dari dua nilai, dan pemanggil baru ini perlu meneruskan beberapa nilai lain untuk flag.
Selain itu, meskipun memanggil do_match_pathspec()secara langsung tidak benar, kemungkinan besar tidak ada perbedaan dalam hasil akhir yang dapat diamati, karena bug itu hanya berarti fill_diretory()akan muncul kembali ke direktori yang tidak diperlukan.
Karena pemeriksaan do-this-path-match selanjutnya pada jalur individu di bawah direktori akan menyebabkan jalur tambahan tersebut difilter, satu-satunya perbedaan dari penggunaan fungsi yang salah adalah komputasi yang tidak perlu.
Panggilan buruk kedua untuk do_match_pathspec()dilibatkan - baik melalui perpindahan langsung atau melalui penyalinan + pengeditan - ke sejumlah pemfaktor berikutnya.
Lihat komit 777b420347 (" dir: sinkronkan treat_leading_path()dan read_directory_recursive()", 2019-12-19, Git v2.25.0-rc0 - merge ), 8d92fb2927 (" dir: ganti algoritme eksponensial dengan yang linear", 2020-04-01, Git v2.27.0 -rc0 - merge terdaftar di batch # 5 ), dan 95c11ecc73 ("Perbaiki fill_directory()API yang rawan kesalahan ; buat itu hanya mengembalikan kecocokan", 2020-04-01, Git v2.27.0-rc0 - merge terdaftar di batch # 5 ) .
Yang terakhir memperkenalkan penggunaan do_match_pathspec()pada file individual, dan dengan demikian menghasilkan jalur individual dikembalikan yang seharusnya tidak dikembalikan.
Masalah dengan pemanggilan do_match_pathspec()alih-alih match_pathspec()adalah bahwa setiap pola yang dinegasikan seperti '``:! Unwanted_path`` akan diabaikan .
Tambahkan match_pathspec_with_flags()fungsi baru untuk memenuhi kebutuhan menentukan flag khusus sambil tetap memeriksa pola yang dinegasikan dengan benar, tambahkan komentar besar di atas do_match_pathspec()untuk mencegah orang lain menyalahgunakannya, dan perbaiki pemanggil saat ini do_match_pathspec()untuk menggunakan salah satu match_pathspec()atau match_pathspec_with_flags().
Satu catatan terakhir adalah yang DO_MATCH_LEADING_PATHSPECmembutuhkan pertimbangan khusus saat bekerja dengannya DO_MATCH_EXCLUDE.
Intinya DO_MATCH_LEADING_PATHSPECadalah jika kita memiliki pathspec seperti
*/Makefile
dan kami memeriksa jalur direktori seperti
src/module/component
bahwa kami ingin menganggapnya cocok sehingga kami masuk kembali ke direktori karena _might_ memiliki file bernama Makefiledi bawah.
Namun, saat kita menggunakan pola pengecualian, yaitu kita memiliki pathspec seperti
:(exclude)*/Makefile
kami TIDAK ingin mengatakan bahwa path direktori seperti
src/module/component
adalah pertandingan (negatif).
Meskipun mungkin ada file bernama 'Makefile' di suatu tempat di bawah direktori itu, mungkin juga ada file lain dan kami tidak dapat mengatur semua file di bawah direktori itu terlebih dahulu; kita perlu mengulang dan kemudian memeriksa file satu per satu.
Sesuaikan DO_MATCH_LEADING_PATHSPEClogika agar hanya diaktifkan untuk spesifikasi jalur positif.
!f() { git log ... | path/to/filter-log.pl "$@" | git log --stdin --no-walk; f, atau bahkan menggabungkan bagian pipa itu ke dalam skrip juga.