git grep
Gitコントロールのソースプロジェクトのすべてのブランチ内で実行することは可能ですか?または、実行する別のコマンドはありますか?
git grep
Gitコントロールのソースプロジェクトのすべてのブランチ内で実行することは可能ですか?または、実行する別のコマンドはありますか?
回答:
「Gitの履歴でコミットされたコードをgrep(検索)する方法は?」
git grep <regexp> $(git rev-list --all)
これにより、すべてのブランチを含むすべてのコミットが検索されます。
別の形式は次のとおりです。
git rev-list --all | (
while read revision; do
git grep -F 'yourWord' $revision
done
)
あなたはこの記事でさらに多くの例を見つけることができます:
gitが引数のサイズについて不平を言うのに十分な大きさの1つのプロジェクトで上記を試したので、この問題が発生した場合は、次のようにします。
git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)
(下のこの回答の最後のセクションにある代替案を参照してください)
必要に応じて、これらの設定を忘れないでください。
# Allow Extended Regular Expressions
git config --global grep.extendRegexp true
# Always Include Line Numbers
git config --global grep.lineNumber true
このエイリアスも役立ちます:
git config --global alias.g "grep --break --heading --line-number"
注:chernjie は、これgit rev-list --all
はやり過ぎだと提案しました。
より洗練されたコマンドは次のとおりです。
git branch -a | tr -d \* | xargs git grep <regexp>
ブランチ(リモートブランチを含む)のみを検索できるようにします
そのためのbash / zshエイリアスを作成することもできます。
alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>
2016年8月の更新:RMはコメントで推奨しています
バージョンを
fatal: bad flag '->' used after filename
試すときに「」が表示されましたgit branch
。エラーは、HEAD
エイリアス表記に関連付けられていました。私は追加することによって、それを解決した
sed '/->/d'
との間で、パイプにtr
してxargs
コマンド。
git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp>
あれは:
alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep"
grep_all <regexp>
git branch
をtrまたはsed にパイプすることはお勧めできません。git branch
人間が消費するための磁器コマンドです。推奨される代替策については、stackoverflow.com / a / 3847586/2562319を参照してください。
git log
特に多くの一致があり、より最近の(関連する)変更を最初に表示したい場合は、すべてのブランチにわたってテキストを検索するためのより効果的な方法になります。
git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'
これらのログコマンドは、特定の検索文字列/正規表現を(一般的に)より新しいものから最初に追加または削除するコミットをリストします。この-p
オプションを使用すると、パターンが追加または削除された場所に関連するdiffが表示されるため、コンテキストで確認できます。
探していたテキストを追加する関連コミット(たとえば、8beeff00d)を見つけたら、そのコミットを含むブランチを見つけます。
git branch -a --contains 8beeff00d
私はこれが最も便利だと思いました:
git grep -i foo `git for-each-ref --format='%(refname)' refs/`
リモートブランチとローカルブランチのみを確認するかどうかに応じて、最後の引数を調整する必要があります。
git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)
作成したエイリアスは次のようになります。
grep-refs = !sh -c 'git grep "$0" "$@" "$(git for-each-ref --format=\"%(refname)\"" refs/)'
git for-each-ref
ました--sort=-committerdate --count=100
!オリジナルのアイデアをありがとう!
2つの一般的な方法でそれを行うことが可能です:BashまたはGitエイリアス
以下に3つのコマンドを示します。
git grep-branch
-ローカルおよびリモートのすべてのブランチで検索git grep-branch-local
-地元の支店のみを検索git grep-branch-remote
-リモートブランチのみ使い方は同じです git grep
git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"
追加した複雑なコードを評価してそれを台無しにする~/.gitconfig
ため、コマンドは手動でファイルに追加する必要があります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 "
注:エイリアスを追加しても実行に失敗する\
場合は、バックスラッシュを確認してください。bashコマンド\\
と比較して、追加のエスケープが必要になる場合があります。
git branch -a
-すべてのブランチを表示します。sed -e 's/[ \\*]*//'
-トリムスペース(からbranch -a
)および*(アクティブなブランチ名にはそれがあります);grep -v -e '\\->'
-のような複雑な名前は無視してくださいremotes/origin/HEAD -> origin/master
。grep '^remotes'
-すべてのリモートブランチを取得します。grep -v -e '^remotes'
- リモートブランチ以外のブランチを取得します。git grep-branch-local -n getTastyCookies
-n
一致する行の前に行番号を付けます。
[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)
現在の構造は次のとおりです。
:
-セパレーター
dev
53
modules/factory/getters.php
function getTastyCookies($user)
ご存知のとおり:Bashコマンドは.sh
スクリプトに格納するか、シェルで実行する必要があります。
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
すべてのブランチを表示するを常に使用するのはなぜですか?git branch
コマンドのオプションを使用して、ブラケットを分離することをお勧めします。ローカルブランチを見ると、は1つしか*
ないため、sedでエスケープする必要はありません。つまりgit branch | sed -e 's/*/ /' | xargs git grep "TEXT"
、ローカルブランチのみ、git branch -r | grep -v -- "->" | xargs git grep "TEXT"
リモートブランチのみ、およびgit branch -a | grep -v -- "->" | xargs git grep "TEXT"
すべてのブランチ
ここに私がそれをする方法があります:
git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM