git grep
Git kontrol kaynaklı bir projenin tüm şubelerinde çalışmak mümkün müdür ? Yoksa çalıştırılacak başka bir komut var mı?
git grep
Git kontrol kaynaklı bir projenin tüm şubelerinde çalışmak mümkün müdür ? Yoksa çalıştırılacak başka bir komut var mı?
Yanıtlar:
" Git geçmişinde işlenmiş kodu nasıl grep (arama))? Sorusu şunları önerir:
git grep <regexp> $(git rev-list --all)
Bu, tüm şubeleri içermesi gereken tüm taahhütleri araştırır.
Başka bir form:
git rev-list --all | (
while read revision; do
git grep -F 'yourWord' $revision
done
)
Bu makalede daha da fazla örnek bulabilirsiniz :
Git argüman boyutu hakkında şikayet yeterince büyük bir projede yukarıdaki denedim, bu yüzden bu sorunla karşılaşırsanız, gibi bir şey yapın:
git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)
(aşağıdaki bu cevabın son bölümünde bir alternatife bakın)
İsterseniz bu ayarları unutmayın:
# Allow Extended Regular Expressions
git config --global grep.extendRegexp true
# Always Include Line Numbers
git config --global grep.lineNumber true
Bu takma ad da yardımcı olabilir:
git config --global alias.g "grep --break --heading --line-number"
Not: chernjie bunun aşırıya kaçması olduğunu öne sürdügit rev-list --all
.
Daha rafine bir komut şunlar olabilir:
git branch -a | tr -d \* | xargs git grep <regexp>
Bu, yalnızca dalları aramanıza olanak tanır (uzak dallar dahil)
Bunun için bir bash / zsh takma adı bile oluşturabilirsiniz:
alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>
Ağustos 2016'yı Güncelle: RM yorumlarda öneriliyor
Sürümü
fatal: bad flag '->' used after filename
denerken " " aldımgit branch
. Hata, birHEAD
takma ad gösterimi ile ilişkilendirildi .Komutları
sed '/->/d'
arasına,tr
vexargs
komutları arasına bir a ekleyerek çözdüm.
git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp>
Yani:
alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep"
grep_all <regexp>
git branch
Çıkışını tr veya sed'e çekmek iyi bir fikir değildir ; git branch
insan tüketimi için tasarlanmış bir porselen komutudur. Tercih edilen alternatifler için stackoverflow.com/a/3847586/2562319 adresine bakın .
git log
özellikle çok sayıda eşleşme varsa ve önce daha yeni (alakalı) değişiklikler görmek istiyorsanız, tüm şubelerde metin aramanın daha etkili bir yolu olabilir.
git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'
Bu günlük komutları listesi, belirli bir arama dizesini / regex'i (genellikle) daha önce ekleyen veya kaldıran taahhüt eder. -p
Opsiyon model eklendi veya kaldırıldı nereye bağlam içinde görebilirsiniz alakalı fark, gösterildiği neden olur.
Aradığınız metni ekleyen alakalı bir taahhüt bulduktan sonra (örn. 8beeff00d), taahhüdü içeren şubeleri bulun:
git branch -a --contains 8beeff00d
Bunu en yararlı buldum:
git grep -i foo `git for-each-ref --format='%(refname)' refs/`
Son bağımsız değişkenleri yalnızca uzak ve yerel şubelere bakmak isteyip istemediğinize bağlı olarak ayarlamanız gerekir.
git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)
Oluşturduğum takma ad şöyle:
grep-refs = !sh -c 'git grep "$0" "$@" "$(git for-each-ref --format=\"%(refname)\"" refs/)'
git for-each-ref
ile güncelledim --sort=-committerdate --count=100
! Orijinal fikir için teşekkürler!
Bunu iki yaygın şekilde yapmak mümkündür: Bash veya Git takma adları
İşte üç komut:
git grep-branch
- Yerel ve uzak tüm şubelerde aramagit grep-branch-local
- Yalnızca yerel şubelerde aragit grep-branch-remote
- Yalnızca uzak dallarKullanımı ile aynı git grep
git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"
Eklediğiniz karmaşık kodu değerlendirip karıştırdığınız için komutlar ~/.gitconfig
dosyaya manuel olarak eklenmelidir git config --global alias
.
[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 "
Not: Takma ad eklediğinizde ve bunlar çalışmadığında - ters eğik çizgileri kontrol edin , bash komutlarına kıyasla \
ek kaçış gerektirebilirler .\\
git branch -a
- Tüm dalları göster;sed -e 's/[ \\*]*//'
- Kesme boşlukları (itibaren branch -a
) ve * (etkin dal adında);grep -v -e '\\->'
- Gibi karmaşık isimleri yoksay remotes/origin/HEAD -> origin/master
;grep '^remotes'
- Tüm uzak dalları alın;grep -v -e '^remotes'
- Uzak şubeler hariç şubeleri alın ;git grep-branch-local -n getTastyCookies
-n
Satır numarasını eşleşen satırlara önekleyin.
[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)
Mevcut yapı:
:
- Ayırıcı
dev
53
modules/factory/getters.php
function getTastyCookies($user)
Bildiğiniz gibi: Bash komutları .sh
komut dosyalarında saklanmalı veya bir kabukta çalıştırılmalıdır.
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
tüm dalları gösteren kullanın ? git branch
Brachları ayırmak için komutun seçeneklerini kullanmanızı öneririm . Yerel şubelere bakarken, sadece bir tane var *
, bu yüzden sed için kaçmaya gerek yok. Yani: git branch | sed -e 's/*/ /' | xargs git grep "TEXT"
sadece yerel şubeler için, sadece git branch -r | grep -v -- "->" | xargs git grep "TEXT"
uzak şubeler için ve git branch -a | grep -v -- "->" | xargs git grep "TEXT"
tüm şubeler için
İşte nasıl yaparım:
git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM