特定の単語のGit commit差分またはコンテンツをgrepする方法


622

Gitコードリポジトリで、特定の単語を含むすべてのコミットを一覧表示します。私はこれを試しました

git log -p | grep --context=4 "word"

しかし、必ずしも検索したファイル名が返されるわけではありません(検索した単語から5行以内の場合を除きます)。

git grep "word"

しかし、それは私に現在のファイルのみを提供し、履歴は提供しません。

特定の単語の変更を追跡できるように、履歴全体を検索するにはどうすればよいですか?コードベースで単語の出現を検索して、変更を追跡します(ファイル履歴で検索)。


回答:


906

コミットメッセージに特定の単語が含まれているすべてのコミットを検索する場合は、

$ git log --grep=word

ファイルの内容で「単語」が追加または削除されたすべてのコミットを検索する場合(より正確には、「単語」の出現回数が変更された場合)、つまり、コミットの内容を検索するには、いわゆる「pickaxe」検索を使用します。

$ git log -Sword

現代のgitにもあります

$ git log -Gword

追加または削除された行が「単語」と一致する違いを探す(内容をコミットする))。

-Gデフォルトで正規表現を-S受け入れますが、文字列は受け入れますが、を使用して正規表現を受け入れるように変更できます--pickaxe-regex

-S<regex> --pickaxe-regexとの違いを説明するため-G<regex>に、同じファイルに次のdiffがあるコミットを考えます。

+    return !regexec(regexp, two->ptr, 1, &regmatch, 0);
...
-    hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);

一方でgit log -G"regexec\(regexp"このコミット表示され、git log -S"regexec\(regexp" --pickaxe-regex(その文字列の出現回数が変更されていないため)しません。


Git 2.25.1(2020年2月)では、これらの正規表現を中心にドキュメントが明確になっています。

MartinÅgren( ``)によるcommit 9299f84(2020年2月6日)を参照してください。(合併によりJunio C浜野- -0d11410コミットし、2020年2月12日)を
gitster

diff-options.txt:例では「正規表現」オーバーロードを回避

報告者:Adam Dinwoodie
署名者:MartinÅgren査読者
:Taylor Blau

-G-S(を使用して--pickaxe-regex)の違いを例示するときは、git diff「regexec」、「regexp」、「regmatch」などを含むdiffと呼び出しの例を使用してそうします。

例は正しいですが、私たちの主張を本当に必要としない限り、「regex。*」を書くことを避けることで、もつれを解きやすくすることができます。

代わりに、作成された正規表現ではない単語を使用してください。

git diffドキュメントが今含まれています:

-S<regex> --pickaxe-regexと の違いを説明する-G<regex>に、同じファイルに次のdiffがあるコミットを考えます。

+    return frotz(nitfol, two->ptr, 1, 0);
...
-    hit = frotz(nitfol, mf2.ptr, 1, 0);

一方でgit log -G"frotz\(nitfol"このコミット表示され、git log -S"frotz\(nitfol" --pickaxe-regex(その文字列の出現回数が変更されていないため)しません。


3
@TankorSmash -S<string><string>のインスタンスを導入または削除する違いを探します。-G<string>追加または削除された行が指定された<regex>と一致する違いを探します。
m-ric 2013年

1
@ m-ricああ、なるほど、単一の文字列インスタンスではなく、行全体です!ありがとう
TankorSmash 2013年

3
@ m-ric、@ TankorSmash:違いは、検索がすべてのコミットdiffで行を追加および削除しながら-S<string><string>変更の発生回数のみをチェックするため、高速-G<string>です。
JakubNarębski2013年

3
あなたは、間にスペースで単語を検索する必要がある場合は、git log --grep="my words"
MEM 2014年

4
@MEM --grep-Sおよびとは異なり-Gます。これらの各引数に文字列を引用できます。
Acumenus 2014

255

git logのつるはしは、 "word"を含む変更を含むコミットを検索します git log -Sword


60
これは完全に正確ではありません。-S <string> <string>のインスタンスを導入または削除する違いを探します。これは、diff出力に単に表示される文字列とは異なることに注意してください。
ティムタム

4
これは一般的には正しい答えですが、私は他の人にこの答え(stackoverflow.com/a/1340245/586983)を読むように勧めるだけに反対しました。
jakeonrails

18
やった!正解に反対票を投じるのはそれが理由だとは思いません...コメントにリンクを含めることで十分ではないでしょうか?
デボラ2016年

@jakeonrails、その回答はこの(古い)回答の編集であるはずなので、これらの迷惑な重複はありません。しかし、人々はクリーンな回答ページではなく、評判だけを望んでいます。
ユリウスオノフレ

22

多くの実験の後、次のことをお勧めします。これは、特定の正規表現を含む行を導入または削除するコミットを示し、追加および削除された単語を示す色で、それぞれのテキストの変更を表示します。

git log --pickaxe-regex -p --color-words -S "<regexp to search for>"

ただし、実行には少し時間がかかります... ;-)


2
これは、これまでで最高の感謝の1つです。ヒント:ページングなしですべての結果を一覧表示するには、コマンドの前にコマンドをGIT_PAGER=cat追加するか、コマンドを追加します| cat
Zack Morris

パスまたはファイルを指定すると、はるかに速くなりますgit log --pickaxe-regex -p --color-words -S "<regexp to search for>" <file or fiepath>

10

次のコマンドを試すことができます。

git log --patch --color=always | less +/searching_string

またはgrep次のように使用します:

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'

検索する親ディレクトリでこのコマンドを実行します。


2
私が見ているコミットには無関係な変更が何百行もあり、私が探している単語を含む実際のパッチにのみ興味があるので、この方法が好きです。色使いにgit log --patch --color=always | less +/searching_string
Radon Rosborough、2016年

9

それを行うもう1つの方法/構文は次のとおりです:git log -S "word"
このようにあなたは例えば検索できますgit log -S "with whitespaces and stuff @/#ü !"



1

正規表現でブール型コネクターを使用するには:

git log --grep '[0-9]*\|[a-z]*'

この正規表現は、コミットメッセージで正規表現[0-9] *または[az] *を検索します。


-1

機密データを検索してgit履歴から削除したい場合(これが私がここに上陸した理由です)、そのためのツールがあります。その問題の専用ヘルプページとして Github

ここに記事の要点があります:

BFGレポ-Cleanerは、不要なデータを除去するためのgitのフィルタ分岐に速く、より簡単な代替手段です。たとえば、機密データを含むファイルを削除し、最新のコミットをそのままにするには、次のコマンドを実行します。

bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA

passwords.txtにリストされているすべてのテキストを、リポジトリの履歴にあるすべての場所で置き換えるには、次のコマンドを実行します。

bfg --replace-text passwords.txt

完全な使用方法とダウンロード手順については、BFG Repo-Cleanerのドキュメントを参照してください。


ここの代わりに、stackoverflow.com
questions / 872565 /…
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.