web-dev-qa-db-ja.com

Gitプロジェクトのすべてのブランチで「grep検索」を実行できますか?

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

115
epsilones

質問 " 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月更新: R.M。 推奨事項

fatal: bad flag '->' used after filenameバージョンを試すと、「git branch」が表示されました。エラーは、HEADエイリアス表記に関連付けられていました。

trコマンドとxargsコマンドの間に、パイプにsed '/->/d'を追加して解決しました。

 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>
163
VonC

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
48
Edward Anderson

私はこれが最も便利だと感じました:

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/)'
19
errordeveloper

2つの一般的な方法でそれを行うことができます:BashまたはGitエイリアス

以下に3つのコマンドを示します。

  1. git grep-branch-ローカルおよびリモートのすべてのブランチで検索
  2. git grep-branch-local-ローカルブランチのみで検索
  3. git grep-branch-remote-リモートブランチのみ

使用法は git grep と同じです

git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"

GREPを使用:Gitエイリアス

ファイル〜/ .gitconfig

~/.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/[ \\*]*//'-トリムspacesbranch -aから)および*(アクティブなブランチ名にある);
  • grep -v -e '\\->'-remotes/Origin/HEAD -> Origin/masterのような複雑な名前を無視します。
  • grep '^remotes'-すべてのリモートブランチを取得します。
  • grep -v -e '^remotes'-ブランチを取得exceptリモートブランチ;

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)

現在の構造は次のとおりです。

:-セパレーター

  1. ブランチ:dev
  2. 行番号:53
  3. ファイルパス:modules/factory/getters.php
  4. 一致する行:function getTastyCookies($user)

GREPを使用:BASH

ご存じのとおり: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"
5
Devaldo

以下にその方法を示します。

git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM
4

コミットSHA1をgit grepに与えると、作業コピーではなく、それらを検索します。

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

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

...そして忍耐があります

3
CharlesB