Menggunakan Git, bagaimana saya bisa mencari string di semua cabang?

170

Menggunakan Git, bagaimana saya bisa mencari di dalam semua file di semua cabang lokal untuk string yang diberikan?

Khusus GitHub: apakah mungkin melakukan pencarian di atas di semua cabang GitHub? (Ada beberapa cabang jarak jauh di repositori GitHub jarak jauh saya yang idealnya tidak perlu saya hentikan untuk pencarian ini ...)

Ivar
sumber
1
git-grep mungkin yang Anda cari, tapi saya belum yakin pilihan mana yang Anda butuhkan ...
johnny

Jawaban:

170

Anda dapat melakukan ini di repositori Git:

git grep "string/regexp" $(git rev-list --all)

Pencarian lanjutan GitHub memiliki kemampuan pencarian kode:

Pencarian kode akan melihat semua kode yang dihosting secara publik di GitHub. Anda juga dapat memfilter menurut:

  • bahasa: language:
  • nama repositori (termasuk nama pengguna): repo:
  • path file: path:
manojlds
sumber
Ini menyebabkan saya kesalahan segmentasi. Mungkin tortoisegitmerge (Windows).
bean5
6
Ini sebenarnya bukan cara terbaik untuk melakukan ini. Itu tidak mengontrol jumlah referensi git yang diteruskan ke git grep .... Lihatlah jawaban yang lain, mereka jauh lebih baik daripada yang ini meskipun itu ditandai sebagai jawaban yang diterima!
slm
1
alangkah baiknya jika Anda dapat menambahkan contoh untuk filter Anda, misalnya path:, karena dokumentasi sekilas tidak terlihat jelas di mana menerapkan filter ini, apakah saya berasumsi sebelum kutipan dalam contoh permintaan Anda?
mengacaukan
3
bagaimana saya bisa mendaftar nama cabang saja. Saat ini, daftar semua hash berisi string.
harryfeng
4
Github pencarian di cabang master hanya . Dari help.github.com/articles/searching-code : "Hanya cabang default yang diindeks untuk pencarian kode. Dalam kebanyakan kasus, ini akan menjadi cabang master."
RedPanda
124

Jika Anda menggunakan perintah @manojlds Git grep dan mendapatkan kesalahan:

-bash: /usr/bin/git: Argument list too long" 

maka Anda harus menggunakan xargs :

git rev-list --all | xargs git grep "string/regexp"

Lihat juga Cara grep (cari) kode yang dilakukan dalam sejarah Git

teastburn
sumber
Juga, ini tampaknya lebih kompatibel dengan jenis konsol lain seperti kulit ikan
Daniel
1
Terima kasih!!! menggunakan ZSH dan ini berfungsi saat perintah @manojlds memberikan kesalahan yang Anda sebutkan! Tetapi peringatan, ini bisa sangat SANGAT lama untuk repo besar dengan sejarah panjang.
lacostenycoder
54

Dalam banyak kasus git rev-list --alldapat mengembalikan sejumlah besar komitmen, membutuhkan waktu lama untuk memindai. Jika Anda, alih-alih mencari melalui setiap komit pada setiap cabang dalam riwayat repositori Anda, hanya ingin mencari semua tips cabang, Anda dapat menggantinya dengan git show-ref --heads. Jadi totalnya:

git grep "string" `git show-ref --heads`

atau:

git show-ref --heads | xargs git grep "string"

Kiat: Anda dapat menulis keluaran dalam file untuk dilihat di editor:

nano ~/history.txt
git show-ref --heads | xargs git grep "search string here" >> ~/history.txt
Zitrax
sumber
6
git show-ref --headsdaftar hash dan nama ref sehingga (baris 2) akan mencari dua kali. jadi git show-ref --heads | cut -d' ' -f2lebih baik karena hanya akan mencantumkan nama-nama ref.
hIpPy
4
Saya tidak percaya berapa kali pertanyaan ini ditanyakan dan dijawab, tetapi hanya Anda yang memiliki jawaban yang benar .
Sammitch
1
git show-ref --heads -shanya mengeluarkan hash SHA1. Juga, jika ada beberapa cabang yang menunjuk ke komit yang sama, Anda akan memiliki duplikat. Anda dapat menghapusnya dengan sort -u, sepertigit show-ref --heads -s | sort -u | xargs git grep ...
Steve
Inilah fungsi yang saya tambahkan ke bashrc saya. Semoga ini bisa membantu seseorang:function gsearch { git grep $1 $(git show-ref --heads) | grep "refs/heads" | grep $1 } # last grep to keep grep color highlight
AFP_555
Ini harus menjadi jawaban yang diterima. Memegang string di semua cabang tetapi hanya untuk konten terbaru adalah kasus penggunaan yang sangat umum.
dr_
21

Ada beberapa masalah dengan solusi yang tercantum di sini (bahkan diterima).

Anda tidak perlu mendaftar semua hash karena Anda akan mendapatkan duplikat. Juga, itu membutuhkan lebih banyak waktu.

Itu dibangun di sini di mana Anda dapat mencari string "test -f /"di beberapa cabang masterdan devsebagai

git grep "test -f /" master dev

yang sama dengan

printf "master\ndev" | xargs git grep "test -f /"

Jadi begini.

Ini menemukan hash untuk tip dari semua cabang lokal dan hanya mencari di dalam komit:

git branch -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"

Jika Anda perlu mencari di cabang terpencil juga maka tambahkan -a:

git branch -a -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"

Lebih lanjut:

# Search in local branches
git branch | cut -c3- | xargs git grep "string"

# Search in remote branches
git branch -r | cut -c3- | xargs git grep "string"

# Search in all (local and remote) branches
git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string"

# Search in branches, and tags
git show-ref | grep -v "refs/stash" | cut -d' ' -f2 | xargs git grep "string"
hIpPy
sumber
5
setidaknya untuk pencarian di semua cabang harus: git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string" atau akan gagal dengan ->simbol dalam daftar file, yang menunjukkan hubungan lokal ke cabang jauh
Ilya Sheershoff
7

Anda dapat mencoba ini:

git log -Sxxxx  # Search all commits
git log -Sxxxx  --branches[=<pattern>]   # Search branches
Victor Choy
sumber
1
Di semua cabang:git log --all -s"search_string"
Tim Kuipers