Apakah mungkin untuk dijalankan git grepdi dalam semua cabang dari proyek bersumber kendali Git? Atau apakah ada perintah lain untuk dijalankan?
Apakah mungkin untuk dijalankan git grepdi dalam semua cabang dari proyek bersumber kendali Git? Atau apakah ada perintah lain untuk dijalankan?
Jawaban:
Pertanyaan " Bagaimana cara grep (mencari) kode yang berkomitmen di histori git? " Merekomendasikan:
git grep <regexp> $(git rev-list --all)
Itu mencari melalui semua komit, yang harus mencakup semua cabang.
Bentuk lain adalah:
git rev-list --all | (
while read revision; do
git grep -F 'yourWord' $revision
done
)
Anda dapat menemukan lebih banyak contoh di artikel ini :
Saya mencoba hal di atas pada satu proyek yang cukup besar sehingga git mengeluh tentang ukuran argumennya, jadi jika Anda mengalami masalah ini, lakukan sesuatu seperti:
git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)
(lihat alternatif di bagian terakhir dari jawaban ini, di bawah)
Jangan lupa pengaturan tersebut, jika Anda menginginkannya:
# Allow Extended Regular Expressions
git config --global grep.extendRegexp true
# Always Include Line Numbers
git config --global grep.lineNumber true
Alias ini juga dapat membantu:
git config --global alias.g "grep --break --heading --line-number"
Catatan: saran chernjie itu berlebihan. git rev-list --all
Perintah yang lebih halus dapat berupa:
git branch -a | tr -d \* | xargs git grep <regexp>
Yang memungkinkan Anda untuk mencari hanya cabang (termasuk cabang jarak jauh)
Anda bahkan dapat membuat alias bash / zsh untuk itu:
alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>
Pembaruan Agustus 2016: RM merekomendasikan di komentar
Saya mendapat "
fatal: bad flag '->' used after filename" saat mencobagit branchversi. Kesalahan itu terkait denganHEADnotasi aliasing.Saya menyelesaikannya dengan menambahkan a
sed '/->/d'di pipa, antaratrdanxargsperintah.
git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp>
Itu adalah:
alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep"
grep_all <regexp>
git branchke tr atau sed; git branchadalah perintah porselen yang dimaksudkan untuk konsumsi manusia. Lihat stackoverflow.com/a/3847586/2562319 untuk alternatif pilihan.
git log bisa menjadi cara yang lebih efektif untuk mencari teks di semua cabang, terutama jika ada banyak yang cocok, dan Anda ingin melihat perubahan yang lebih baru (relevan) terlebih dahulu.
git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'
Daftar perintah log ini melakukan yang menambah atau menghapus string pencarian / regex yang diberikan, (umumnya) lebih baru terlebih dahulu. The -ppilihan menyebabkan diff relevan untuk ditampilkan di mana pola ditambahkan atau dihapus, sehingga Anda dapat melihatnya dalam konteks.
Setelah menemukan komit relevan yang menambahkan teks yang Anda cari (mis. 8beeff00d), temukan cabang yang berisi komit:
git branch -a --contains 8beeff00d
Menurut saya ini paling berguna:
git grep -i foo `git for-each-ref --format='%(refname)' refs/`
Anda perlu menyesuaikan argumen terakhir tergantung pada apakah Anda hanya ingin melihat cabang jarak jauh vs. lokal, yaitu:
git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)Alias yang saya buat terlihat seperti ini:
grep-refs = !sh -c 'git grep "$0" "$@" "$(git for-each-ref --format=\"%(refname)\"" refs/)'
git for-each-refdengan --sort=-committerdate --count=100! Terima kasih atas ide aslinya!
Anda dapat melakukannya dengan dua cara umum: alias Bash atau Git
Berikut tiga perintah:
git grep-branch - Cari di semua cabang lokal & jarak jauhgit grep-branch-local - Cari di cabang lokal sajagit grep-branch-remote - Cabang terpencil sajaPenggunaannya sama dengan git grep
git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"
Perintah harus ditambahkan secara manual ke ~/.gitconfigfile, karena git config --global aliasmengevaluasi kode kompleks yang Anda tambahkan dan mengacaukannya.
[alias]
grep-branch = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | xargs git grep $@; };f "
grep-branch-remote = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | grep '^remotes' | xargs git grep $@; };f"
grep-branch-local = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' -e '^remotes' | xargs git grep $@; };f "
Catatan: Saat Anda menambahkan alias dan gagal dijalankan - periksa garis miring terbalik, \mereka mungkin memerlukan pelolosan tambahan \\dibandingkan dengan perintah bash .
git branch -a - Tampilkan semua cabang;sed -e 's/[ \\*]*//'- Potong spasi (dari branch -a) dan * (nama cabang aktif memilikinya);grep -v -e '\\->'- Abaikan nama yang rumit seperti remotes/origin/HEAD -> origin/master;grep '^remotes' - Dapatkan semua cabang jarak jauh;grep -v -e '^remotes'- Dapatkan cabang kecuali cabang jarak jauh;git grep-branch-local -n getTastyCookies-n Awali nomor baris ke baris yang cocok.
[user@pc project]$ git grep-branch-local -n getTastyCookies
dev:53:modules/factory/getters.php:function getTastyCookies($user);
master:50:modules/factory/getters.php:function getTastyCookies($user)
Struktur saat ini adalah:
: - Pemisah
dev53modules/factory/getters.phpfunction getTastyCookies($user)Seperti yang harus Anda ketahui: Perintah Bash harus disimpan dalam .shskrip atau dijalankan di shell.
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' -e '^remotes' | xargs git grep "TEXT"
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | grep '^remotes' | xargs git grep "TEXT"
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | xargs git grep "TEXT"
git grep-branch "find my text":fatal: ambiguous argument 'client': both revision and filename
-a, yang menunjukkan semua cabang? Saya akan menyarankan menggunakan opsi untuk git branchperintah untuk memisahkan braches. Saat melihat cabang lokal, hanya ada satu *, jadi tidak perlu menghindarinya karena sed. Jadi: git branch | sed -e 's/*/ /' | xargs git grep "TEXT"untuk cabang lokal saja, git branch -r | grep -v -- "->" | xargs git grep "TEXT"untuk cabang terpencil saja, dan git branch -a | grep -v -- "->" | xargs git grep "TEXT"untuk semua cabang
Begini cara saya melakukannya:
git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM
Jika Anda memberikan komit nilai hash SHA-1, git grepAnda harus mencarinya di dalamnya, bukan di copy pekerjaan.
Untuk mencari semua cabang, Anda bisa mendapatkan semua pohon git rev-list --all. Taruh semuanya dengan
git grep "regexp" $(git rev-list --all)
... dan memiliki kesabaran