166

git grepGit コントロール ソース プロジェクトのすべてのブランチ内で実行することは可能ですか? または、実行する別のコマンドがありますか?

4

6 に答える 6

221

質問「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 を追加することで解決しました。trxargs

 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>
于 2013-03-08T11:47:08.583 に答える
29

これが最も便利だと思いました:

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/)'
于 2014-01-22T13:32:28.560 に答える
4

コミットにSHA-1ハッシュ値を指定git grepすると、作業コピーではなく、SHA-1ハッシュ値が検索されます。

すべてのブランチを検索するには、ですべてのツリーを取得できますgit rev-list --all。すべてを

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

...そして忍耐力を持っている

于 2013-03-08T11:46:28.087 に答える