Gitを使用して、すべてのブランチで文字列を検索するにはどうすればよいですか?


170

Gitを使用して、特定の文字列をすべてのローカルブランチのすべてのファイル内で検索するにはどうすればよいですか?

GitHub固有:すべてのGitHubブランチで上記の検索を実行できますか?(リモートGitHubリポジトリにはいくつかのリモートブランチがあり、理想的にはこの検索のためにダウンさせる必要はありません...)


1
git-grepがあなたが探しているものかもしれませんが、どのオプションが必要かはまだ
わかり

回答:


170

これはGitリポジトリで実行できます。

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

GitHubの高度な検索には、コード検索機能があります。

コード検索は、GitHubで公開されているすべてのコードを調べます。次の条件でフィルタリングすることもできます。

  • 言語: language:
  • リポジトリ名(ユーザー名を含む): repo:
  • ファイルパス: path:

これにより、セグメンテーション違反が発生します。ただし、tortoisegitmerge(Windows)の場合もあります。
bean5 2014

6
これは本当にこれを行うための最良の方法ではありません。に渡されるgit refの量は制御しませんgit grep ...。他の回答を見てください。受け入れられた回答としてマークされていますが、この回答よりもはるかに優れています。
slm

1
フィルターの例を追加できると便利です。たとえばpath:、一見しただけではドキュメントにこのフィルターを適用する場所が明確に見えないため、クエリの例で引用符の前にあると想定していますか?
blamb

3
ブランチ名のみを表示するにはどうすればよいですか。現在、文字列を含むすべてのハッシュをリストします。
ハリーフェン2017

4
Github検索はマスターブランチのみで実行されます。help.github.com/articles/searching-codeから:「デフォルトのブランチのみがコード検索用にインデックス付けされます。ほとんどの場合、これはマスターブランチになります。」
RedPanda 2018

124

@manojlds Git grepコマンドを使用してエラーが発生した場合:

-bash: /usr/bin/git: Argument list too long" 

次に、xargsを使用する必要があります。

git rev-list --all | xargs git grep "string/regexp"

Git履歴のコミットされたコードをgrep(検索)する方法も参照してください


また、これはフィッシュシェルのような他の種類のコンソールとの互換性がより高いようです
Daniel

1
ありがとう!!! ZSHを使用してこれは機能しましたが、@ manojldsコマンドはあなたが言及したエラーを出しました!しかし、警告、これには長い歴史を持つ大規模なリポジトリの場合、非常に長い時間がかかる可能性があります。
lacostenycoder

54

多くの場合git rev-list --all、膨大な数のコミットが返され、スキャンに時間がかかります。リポジトリ履歴内のすべてのブランチのすべてのコミットを検索するのではなく、ブランチのすべてのヒントを検索したい場合は、それをに置き換えることができますgit show-ref --heads。合計で:

git grep "string" `git show-ref --heads`

または:

git show-ref --heads | xargs git grep "string"

ヒント:出力をファイルに書き込んで、エディターで表示できます。

nano ~/history.txt
git show-ref --heads | xargs git grep "search string here" >> ~/history.txt

6
git show-ref --headsハッシュと参照名をリストするので、2番目の行で2回検索されます。git show-ref --heads | cut -d' ' -f2ref名のみをリストするので、より良いです。
hIpPy 2017年

4
この質問が何度も尋ねられて答えられたとは信じられませんが、正解はあなただけです。
サミッチ2017

1
git show-ref --heads -sSHA1ハッシュのみを出力します。また、同じコミットを指す複数のブランチがある場合、重複があります。次のsort -uようにして削除できますgit show-ref --heads -s | sort -u | xargs git grep ...
Steve

これがbashrcに追加した関数です。誰かのおfunction gsearch { git grep $1 $(git show-ref --heads) | grep "refs/heads" | grep $1 } # last grep to keep grep color highlight
役に立てば幸いです。– AFP_555

これは受け入れられる答えになるはずです。すべてのブランチ間で文字列をグレッピングするが、最新のコンテンツのみが非常に一般的なユースケースです。
dr_

21

ここにリストされている解決策にはいくつかの問題があります(受け入れられても)。

重複するため、すべてのハッシュをリストする必要はありません。また、時間がかかります。

あなたは文字列を検索することができる場所、それがこの上に構築"test -f /"複数のブランチ上masterdevなどを

git grep "test -f /" master dev

それは同じです

printf "master\ndev" | xargs git grep "test -f /"

だからここに行く。

これは、すべてのローカルブランチの先端のハッシュを見つけ、それらのコミットでのみ検索します。

git branch -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"

リモートブランチも検索する必要がある場合は、次を追加し-aます。

git branch -a -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp"

さらに:

# Search in local branches
git branch | cut -c3- | xargs git grep "string"

# Search in remote branches
git branch -r | cut -c3- | xargs git grep "string"

# Search in all (local and remote) branches
git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string"

# Search in branches, and tags
git show-ref | grep -v "refs/stash" | cut -d' ' -f2 | xargs git grep "string"

5
少なくともすべてのブランチでの検索は次のようになります: git branch -a | cut -c3- | cut -d' ' -f 1 | xargs git grep "string" または->、ローカルからリモートへのブランチ関係を示すファイルリスト内のシンボルで失敗します
Ilya Sheershoff

7

あなたはこれを試すことができます:

git log -Sxxxx  # Search all commits
git log -Sxxxx  --branches[=<pattern>]   # Search branches

1
すべての支店:git log --all -s"search_string"
Tim Kuipers
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.