git grep
Git コントロール ソース プロジェクトのすべてのブランチ内で実行することは可能ですか? または、実行する別のコマンドがありますか?
6 に答える
質問「git履歴でコミットされたコードをgrep(検索)する方法は?」 推奨:
git grep <regexp> $(git rev-list --all)
これは、すべてのブランチを含むすべてのコミットを検索します。
別の形式は次のとおりです。
git rev-list --all | (
while read revision; do
git grep -F 'yourWord' $revision
done
)
この記事でさらに多くの例を見つけることができます:
gitが引数のサイズについて文句を言うほど大きなプロジェクトで上記を試したので、この問題に遭遇した場合は、次のようにしてください。
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"
2016 年 8 月の更新: RMはコメントで推奨しています
バージョン
fatal: bad flag '->' used after filename
を試すと「 」が表示されました。git branch
エラーはHEAD
エイリアシング表記に関連していました。
とコマンド
sed '/->/d'
の間のパイプにa を追加することで解決しました。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>
これはやり過ぎなので、chernjieが提案git rev-list --all
したソリューションの改善です。
より洗練されたコマンドは次のとおりです。
# Don't use this, see above
git branch -a | tr -d \* | xargs git grep <regexp>
これにより、ブランチのみを検索できます(リモートブランチを含む)
bash/zsh エイリアスを作成することもできます。
# Don't use this, see above
alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>
これが最も便利だと思いました:
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/)'
コミットにSHA-1ハッシュ値を指定git grep
すると、作業コピーではなく、SHA-1ハッシュ値が検索されます。
すべてのブランチを検索するには、ですべてのツリーを取得できますgit rev-list --all
。すべてを
git grep "regexp" $(git rev-list --all)
...そして忍耐力を持っている