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:
Bukan ide yang baik untuk menyalurkan output git branchke tr atau sed; git branchadalah perintah porselen yang dimaksudkan untuk konsumsi manusia. Lihat stackoverflow.com/a/3847586/2562319 untuk alternatif pilihan.
Ya, bagus. Melihat melalui jawaban lain, menurut saya jawaban dari @errordeveloper adalah yang terbersih: stackoverflow.com/a/21284342/2562319 : "git grep <regexatever $ (git for-each-ref --format = '% (refname) 'refs /) "
jbyler
2
Apakah ada cara untuk menampilkan nama cabang yang cocok dengan pencarian?
franksands
66
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.
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:
Alias yang menarik. +1. Lebih tepat dari pada jawaban saya.
VonC
Bagaimana cara membuat alias Anda berfungsi untuk pencarian frase? Ketika saya meneruskan "foo bar" sebagai parameter, saya mendapatkan: fatal: argumen ambigu 'bar': revisi yang tidak diketahui atau jalur tidak ada di pohon kerja. Gunakan '-' untuk memisahkan jalur dari revisi
jutky
Coba keluar dari ruang: "foo \ bar"
Garry Gomez
Ini jelas akan menjadi jawaban yang diterima;) Saya telah memperluasnya untuk hanya mencari di cabang terbaru dari proyek saya (Mendapat lebih dari 500, jangan tanya, dan setiap grep membutuhkan waktu sekitar 4 detik jadi saya tidak ingin atau membutuhkan untuk menelusuri lebih dari, katakanlah, 100 yang terbaru). Untuk ini saya telah memperbarui git for-each-refdengan --sort=-committerdate --count=100! Terima kasih atas ide aslinya!
Vser
6
Anda dapat melakukannya dengan dua cara umum: alias Bash atau Git
Berikut tiga perintah:
git grep-branch - Cari di semua cabang lokal & jarak jauh
git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"
GREP menggunakan: alias Git
Berkas ~ / .gitconfig
Perintah harus ditambahkan secara manual ke ~/.gitconfigfile, karena git config --global aliasmengevaluasi kode kompleks yang Anda tambahkan dan mengacaukannya.
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;
Kedengarannya bagus, tapi saya mendapatkan kesalahan ini dari git grep-branch "find my text":fatal: ambiguous argument 'client': both revision and filename
nealmcb
Mengapa selalu digunakan -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
Jawaban:
Pertanyaan " Bagaimana cara grep (mencari) kode yang berkomitmen di histori git? " Merekomendasikan:
Itu mencari melalui semua komit, yang harus mencakup semua cabang.
Bentuk lain adalah:
Anda dapat menemukan lebih banyak contoh di artikel ini :
(lihat alternatif di bagian terakhir dari jawaban ini, di bawah)
Jangan lupa pengaturan tersebut, jika Anda menginginkannya:
Alias ini juga dapat membantu:
Catatan: saran chernjie itu berlebihan.
git rev-list --all
Pembaruan Agustus 2016: RM merekomendasikan di komentar
Itu adalah:
sumber
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.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:
sumber
Menurut saya ini paling berguna:
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:
sumber
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
GREP menggunakan: alias Git
Berkas ~ / .gitconfig
Perintah harus ditambahkan secara manual ke
~/.gitconfig
file, karenagit config --global alias
mengevaluasi kode kompleks yang Anda tambahkan dan mengacaukannya.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 (daribranch -a
) dan * (nama cabang aktif memilikinya);grep -v -e '\\->'
- Abaikan nama yang rumit sepertiremotes/origin/HEAD -> origin/master
;grep '^remotes'
- Dapatkan semua cabang jarak jauh;grep -v -e '^remotes'
- Dapatkan cabang kecuali cabang jarak jauh;Contoh
git grep-branch-local -n getTastyCookies
-n
Awali nomor baris ke baris yang cocok.Struktur saat ini adalah:
:
- Pemisahdev
53
modules/factory/getters.php
function getTastyCookies($user)
GREP menggunakan: BASH
Seperti yang harus Anda ketahui: Perintah Bash harus disimpan dalam
.sh
skrip atau dijalankan di shell.Cabang lokal saja
Cabang jarak jauh saja
Cabang lokal & terpencil
sumber
git grep-branch "find my text"
:fatal: ambiguous argument 'client': both revision and filename
-a
, yang menunjukkan semua cabang? Saya akan menyarankan menggunakan opsi untukgit 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, dangit branch -a | grep -v -- "->" | xargs git grep "TEXT"
untuk semua cabangBegini cara saya melakukannya:
sumber
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... dan memiliki kesabaran
sumber