過去にファイルまたはファイル内のコードを削除したことがあります。(コミットメッセージではなく)コンテンツをgrepできますか?
非常に貧弱な解決策は、ログをgrepすることです。
git log -p | grep <pattern>
ただし、これはコミットハッシュをすぐには返しません。git grep
無駄に遊んだ。
過去にファイルまたはファイル内のコードを削除したことがあります。(コミットメッセージではなく)コンテンツをgrepできますか?
非常に貧弱な解決策は、ログをgrepすることです。
git log -p | grep <pattern>
ただし、これはコミットハッシュをすぐには返しません。git grep
無駄に遊んだ。
回答:
コミットコンテンツ(つまり、コミットメッセージなどではなく実際のソース行)を検索するには、次の操作を行う必要があります。
git grep <regexp> $(git rev-list --all)
git rev-list --all | xargs git grep <expression>
「引数リストが長すぎます」エラーが発生した場合に機能します。
検索を特定のサブツリー(たとえば、「lib / util」)に制限する場合は、それをrev-list
サブコマンドに渡す必要がありgrep
ます。
git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util
これにより、のすべてのコミットテキストがgrepされますregexp
。
両方のコマンドでパスを渡す理由は、rev-list
がすべての変更が行われlib/util
たリビジョンリストを返すためですがgrep
、でのみ検索するように渡す必要もありますlib/util
。
次のシナリオを想像してみてください。によって返された同じリビジョンに含まれている他のファイルでgrep
同じものが見つかる場合があります(そのリビジョンでそのファイルに変更がなかった場合でも)。<regexp>
rev-list
ソースを検索するその他の便利な方法は次のとおりです。
作業ツリーで正規表現regexpに一致するテキストを検索します。
git grep <regexp>
作業ツリーで、正規表現regexp1またはregexp2に一致するテキストの行を検索します。
git grep -e <regexp1> [--or] -e <regexp2>
作業ツリーを検索して、正規表現regexp1およびregexp2に一致するテキストの行を検索し、ファイルパスのみを報告します。
git grep -l -e <regexp1> --and -e <regexp2>
正規表現regexp1に一致するテキストの行と正規表現regexp2に一致するテキストの行があるファイルを作業ツリーで検索します。
git grep -l --all-match -e <regexp1> -e <regexp2>
パターンに一致するテキストの変更された行を作業ツリーで検索します。
git diff --unified=0 | grep <pattern>
正規表現regexpに一致するテキストのすべてのリビジョンを検索します。
git grep <regexp> $(git rev-list --all)
正規表現regexpに一致するテキストについて、rev1とrev2の間のすべてのリビジョンを検索します。
git grep <regexp> $(git rev-list <rev1>..<rev2>)
sh.exe": /bin/git: Bad file number
ます。VonCの回答はmsysgitでも機能します。
git gc
またはチェックアウト:stackoverflow.com/questions/1507463/...
のpickaxe(-S
)オプションを使用する必要がありますgit log
。
検索するにはFoo
:
git log -SFoo -- path_containing_change
git log -SFoo --since=2009.1.1 --until=2010.1.1 -- path_containing_change
詳細については、Gitの履歴を参照してください。
ヤクブNarębskiのコメント:
これは、のインスタンスを導入または削除する違いを探します<string>
。通常、「 'Foo'で行を追加または削除したリビジョン」を意味します。
この--pickaxe-regex
オプションを使用すると、文字列を検索する代わりに、拡張POSIX正規表現を使用できます。例(からgit log
):git log -S"frotz\(nitfol" --pickaxe-regex
ロブはコメントし、この検索では大文字と小文字が区別さ-彼は開かれたフォローアップの質問大文字と小文字を区別しない検索する方法についてを。
git log
あなたの質問のビットは私を混乱させました;)
-p
フラグと組み合わせて、diffも出力します。
--branches --all
では、すべてのリポジトリを検索するためのオプションが必要になります。
私のお気に入りの方法は、git log
の-G
オプション(バージョン1.7.4で追加)を使用することです。
-G<regex>
Look for differences whose added or removed line matches the given <regex>.
-G
と-S
オプションがコミットが一致するかどうかを決定する方法には微妙な違いがあります:
-S
オプションは基本的に、コミットの前後にファイル内で検索が一致した回数をカウントします。前後のカウントが異なる場合、コミットはログに表示されます。たとえば、検索に一致する行が移動されたコミットは表示されません。-G
オプションを使用すると、追加、削除、または変更された行が検索と一致した場合、コミットがログに表示されます。このコミットを例にとります:
diff --git a/test b/test
index dddc242..60a8ba6 100644
--- a/test
+++ b/test
@@ -1 +1 @@
-hello hello
+hello goodbye hello
ファイルに "hello"が現れる回数は、このコミットの前後で同じであるため、を使用した場合とは一致しません-Shello
。ただし、行の一致に変更があったためhello
、コミットはを使用して表示され-Ghello
ます。
-p
、各コミットの差分を表示するオプションを追加します。次に、ページャーでログを開くと、探しているものをすべて検索します。ポケットベルがless
andである場合git log -Ghello -p
、と入力して/hello
を押しEnter
、とを使用n
しN
て「hello」の次/前の出現を検索できます。
-G
とRegexで興味深い問題が見つかりました。コマンドラインでUTF-8を使用していて、表示しているファイルがISOラテン(8ビット)エンコーディングを使用している.*
場合、失敗します。例えば、私は変更を持っているVierter Entwurf
> - Fünfter Entwurf
、しばらくは'V.*ter Entwurf'
、マッチを生成'F.*ter Entwurf'
しません。
コードの変更を閲覧したい場合(履歴全体で特定の単語によって実際に変更されたものを確認する場合)、patch
モードに移動します。次の操作の非常に便利な組み合わせが見つかりました。
git log -p
# Hit '/' for search mode.
# Type in the word you are searching.
# If the first search is not relevant, hit 'n' for next (like in Vim ;) )
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
'
引用符が検索文字列を単一の引数としてグループ化していない。代わりにが'public
の引数-S
であり、残りは別の引数として扱われます。どの環境で実行しているかはわかりませんが、トラブルシューティングを行うにはそのコンテキストが必要です。トラブルシューティングに役立つ場合は、別のStackOverflow質問を開くことをお勧めします。gitコマンドがシェルに送信される方法のすべてのコンテキストが含まれます。他のコマンドで送信されているようですが?ここのコメントは、これを理解するのに適切な場所ではありません。
私はJeetの答えを受け取り、それをWindowsに適合させました(この答えのおかげで):
FOR /F %x IN ('"git rev-list --all"') DO @git grep <regex> %x > out.txt
私にとって、何らかの理由で、この正規表現を削除した実際のコミットは、コマンドの出力ではなく、その前の1つのコミットに表示されていたことに注意してください。
--no-pager
>>results.txt
Windowsパイピングに精通していないものを使用してテキストファイルに追加します...
リビジョン、ファイルを検索:
git rev-list --all | xargs git grep <regexp>
XMLファイルなど、特定のファイルのみを検索します。
git rev-list --all | xargs -I{} git grep <regexp> {} -- "*.xml"
結果の行は次のようになります。6988bec26b1503d45eb0b2e8a4364afb87dde7af:bla.xml:見つかった行のテキスト...
次に、作成者、日付、diffなどの詳細情報を取得できますgit show
。
git show 6988bec26b1503d45eb0b2e8a4364afb87dde7af
簡単にするために、GUIを使用することをお勧めします:gitk-Gitリポジトリブラウザー。それはかなり柔軟です
また、上/下矢印を使用して結果をナビゲートできます。
Sourcetreeでこれを実行しようとしている他の人にとって、UIに直接コマンドはありません(バージョン1.6.21.0以降)。ただし、ターミナルウィンドウ(メインツールバーにあるボタン)を開いてコピー/貼り付けすることにより、承認された回答で指定されたコマンドを使用できます。
注:Sourcetreeの検索ビューでは、部分的にテキスト検索を実行できます。Ctrl+ 3を押して検索ビューに移動します(または下部にある[検索]タブをクリックします)。右端から、[検索の種類]を[ファイルの変更]に設定し、検索する文字列を入力します。この方法には、上記のコマンドと比較して次の制限があります。
私があなたのところにいるときはいつでも、次のコマンドラインを使用します。
git log -S "<words/phrases i am trying to find>" --all --oneline --graph
説明:
git log
-ここにもっと書く必要があります。ログは時系列で表示されます。-S "<words/phrases i am trying to find>"
-これは、任意のファイル(追加/変更/削除)に「<>」記号なしで検索しようとしている単語/フレーズが含まれているすべてのGitコミットを示しています。--all
-すべてのブランチを強制および検索します。--oneline
-Gitログを1行で圧縮します。--graph
-時系列に並べられたコミットのグラフを作成します。それで、何かが最後に存在する場所を確認するために、古いバージョンのコードをgrepしようとしているのでしょうか。
もし私がこれをしているなら、私はおそらくgit bisectを使用するでしょう。bisectを使用して、既知の良好なバージョン、既知の不良バージョン、およびバージョンが良好か不良かを確認する単純なスクリプトを指定できます(この場合は、探しているコードが存在するかどうかを確認するためのgrepです)。 )。これを実行すると、コードがいつ削除されたかがわかります。
git rev-list --all | xargs -n 5 git grep EXPRESSION
はJeetのソリューションを微調整したものです。そのため、検索が終了したときだけでなく、検索中に結果が表示されます(大規模なリポジトリでは時間がかかる場合があります)。
私の場合、私は短いコミットを検索する必要があり、リストされた解決策は残念ながら機能していませんでした。
私はそれをなんとかして(REGEXトークンを置き換えます):
for commit in $(git rev-list --all --abbrev-commit)
do
if [[ $commit =~ __REGEX__ ]]; then
git --no-pager show -s --format='%h %an - %s' $commit
fi
done
git log -S
とblameについて)* ["git log --grep"で楽しむ] [2](コミットメッセージの検索)* [「git grep」で楽しい] [3] [2]:gitster.livejournal.com/30195.html [3]:gitster.livejournal.com/27674.html