Apakah mungkin untuk dijalankan git grep
di dalam semua cabang dari proyek bersumber kendali Git? Atau apakah ada perintah lain untuk dijalankan?
Apakah mungkin untuk dijalankan git grep
di 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 branch
versi. Kesalahan itu terkait denganHEAD
notasi aliasing.Saya menyelesaikannya dengan menambahkan a
sed '/->/d'
di pipa, antaratr
danxargs
perintah.
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 branch
ke tr atau sed; git branch
adalah 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 -p
pilihan 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-ref
dengan --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 ~/.gitconfig
file, karena git config --global alias
mengevaluasi 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
dev
53
modules/factory/getters.php
function getTastyCookies($user)
Seperti yang harus Anda ketahui: Perintah Bash harus disimpan dalam .sh
skrip 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 branch
perintah 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 grep
Anda 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