Apakah ada cara untuk mengecualikan path / direktori / file tertentu saat mencari repositori git menggunakan git grep
? Sesuatu yang mirip dengan --exclude
opsi pada grep
perintah normal ?
Saya perlu menggunakan git grep
karena menggunakan grep
langsung berjalan terlalu lambat pada repositori git besar.
Jawaban:
Itu tidak mungkin, tetapi telah dibahas baru-baru ini . Solusi yang diajukan di tautan:
EDIT lihat hanya jawaban tidak ada , karena git 1.9.0 itu mungkin.
sumber
Dalam git 1.9.0 "kata ajaib"
exclude
ditambahkan kepathspec
s. Jadi jika Anda ingin mencarifoobar
di setiap file kecuali yang cocok,*.java
Anda dapat melakukannya:Atau menggunakan
!
"formulir singkat" untuk mengecualikan:Perhatikan bahwa dalam versi git hingga v2.12, saat menggunakan pengecualian
pathspec
, Anda harus memiliki setidaknya satu "inklusif"pathspec
. Dalam contoh di atas ini adalah./*
(secara rekursif menyertakan semuanya di bawah direktori saat ini). Dalam git v2.13 pembatasan ini dicabut dangit grep foobar -- ':!*.java'
berfungsi tanpa./*
.Anda juga dapat menggunakan sesuatu seperti
:(top)
(formulir pendek:):/
untuk memasukkan semuanya dari atas repo. Tetapi kemudian Anda mungkin juga ingin menyesuaikan pengecualian Andapathspec
untuk memulai dari atas::/!*.java
(jika tidak, itu hanya akan mengecualikan*.java
file dari bawah direktori Anda saat ini).Ada referensi yang baik untuk semua "kata ajaib" diperbolehkan dalam
pathspec
di git-scm.com (atau hanyagit help glossary
). Untuk beberapa alasan, dokumen di kernel.org benar-benar ketinggalan zaman meskipun mereka sering muncul pertama kali dalam pencarian google.sumber
git grep clock.gettime -- './*' ':!arch/**' ':!drivers/**'
untuk mengecualikan beberapa direktori secara keseluruhan. Saya tidak berpikir itu mencegah rekursi.git config alias.mygrep '!git grep "$@" -- "${GIT_PREFIX}/*" ":!*.java*" #'
. Lalu sajagit mygrep foobar
. (Menggunakan alias shell # trick dan dir . Saat ini)git grep
dangit ls-files
dari subdirektori dan keduanya melaporkan nama file relatif ke direktori saat ini (bahkan ketika Anda menggunakan':(top)'
pathspec termasuk). Kedua perintah memiliki--full-name
opsi untuk melaporkan nama relatif ke root, tapi itu tidak aktif secara default.Pembaruan: Untuk git> = 1.9 ada dukungan asli untuk pola kecualikan, lihat hanya satu jawaban .
Ini mungkin tampak mundur, tetapi Anda dapat mengirimkan daftar file yang tidak cocok dengan pola kecualian Anda
git grep
seperti ini:grep -v
mengembalikan setiap jalur yang tidak cocok<exclude-pattern>
. Catatan yanggit ls-files
juga mengambil--exclude
parameter, tetapi itu hanya berlaku untuk file yang tidak dilacak .sumber
Anda dapat menandai file atau direktori sebagai biner dengan membuat file atribut di repositori Anda, mis
Kecocokan dalam file biner terdaftar tanpa baris yang disertakan, misalnya
sumber
Dengan contoh oleh @kynan sebagai basis saya membuat skrip ini dan meletakkannya di path saya (
~/bin/
) sebagaigg
. Itu memang menggunakangit grep
tetapi menghindari beberapa tipe file yang ditentukan.Dalam repo kami ada banyak gambar jadi saya telah mengecualikan file gambar, dan ini mengambil waktu serchtime ke 1/3 jika saya mencari seluruh repo. Tetapi skrip dapat dengan mudah dimodifikasi untuk mengecualikan jenis file atau pola lain.
Catatan 1
Menurut ini , mungkin untuk memberi nama benda itu
git-gg
dan dapat menyebutnya sebagai perintah git biasa seperti:Tapi saya tidak bisa membuatnya bekerja. Saya membuat skrip di saya
~/bin/
dan membuatgit-gg
symlink di/usr/lib/git-core/
.Catatan 2
Perintah tidak dapat dibuat menjadi
sh
git-alias biasa karena perintah itu akan dipanggil di root repo. Dan bukan itu yang saya inginkan!sumber