単一ファイルの履歴で文字列をGit検索


172

だから私は、ファイルが呼び出されている場合はfoo.rb、それは私と呼ばれる欠け方法の誤差与えているバーを、私はの歴史検索したいので、foo.rbを文字列のためbar、それが過去に定義されていたかどうかを確認します。

私はこれが見つけ、文字列のためのGitの歴史のすべてを検索しますか?

しかし、これはすべてのファイルを検索します。1つのファイルで検索したいだけです。


6
参考-- filenameまでに、1つのファイルに制限したい場合は、一連のgitコマンドに追加できます。
カールビーレフェルト

回答:


234

この目的のために、-Sオプションを使用してgit logを実行できます。

git log -S'bar' -- foo.rb

39
またはgit log -G'bar' -- foo.rb、 'bar'の出現回数を変更したコミットではなく、 'bar'を含む差分を検索するには(git-logのマンページを参照)。
JakubNarębski12年

1
それは引用符で私のために機能しませんでした、私はそれを使用-Sbarしてbarを検索する必要がありました。たぶん、それは私がWindowsのコマンドラインを使用して何かをしていることに関係しています。
zbr 2017

言い換えれば、-Gこれは正規表現検索用です...これも素晴らしいリファレンスです:stackoverflow.com/a/4472267/2586761
ptim

17

または、これを試すことができます(関連する質問から、すべてのgit履歴でstringを検索してください

git rev-list --all foo.rb | (
    while read revision; do
        git grep -F 'bar' $revision foo.rb
    done
)

実際にはファイルの内容を探し、バーが発生してもメッセージやパッチをコミットしません。


Windowsの場合:( for /F %i in ('git rev-list --all foo.rb') git grep -F bar %i foo.rbファイル名または検索フレーズにスペースがある場合は、二重引用符に注意してください)
biscuit314

1
Windowsの私にとっては、「do」なしでは機能しませんでした for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb (ファイル名または検索フレーズにスペースが含まれている場合は、二重引用符に注意してください)
xberger

2

git logコマンドのオーバーライドがあります(手動から):

$ git log Makefile      # commits that modify Makefile

だからあなたは使うことができます:

git log foo.rb | grep "bar"

2
おかげで、これはファイルのソースの履歴ではなく、コミット履歴を検索するだけです。
JD Isaacks 2012

2
実際には、文字列データの変更を検索する別のオーバーライドがあります。git log -S'foo() '#文字列' foo() 'に一致するファイルデータを追加または削除するコミット
Dmitry Reznik

1
--full-diffパラメータを使用することもできます。ログにはコミット履歴だけでなく、差分も表示されます。
ドミトリー・レズニック

@DmitriyReznik -明らかに--full-diffせずに(なし差分が示されていない、のように)作業をしない-p少なくともgitの1.7.9.5に、
sdaau

0

git log -S "string" --follow -p "path of file"はその文字列でのすべての変更の完全な履歴を表示するのに使用しまし た。

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