단일 파일 히스토리에서 문자열 검색


172

따라서 foo.rb 라는 파일이 있고 bar 라는 누락 된 메서드에 대한 오류가 발생 하면 문자열 에 대한 foo.rb 기록을 검색 bar하여 과거에 정의 된 적이 있는지 확인하고 싶습니다 .

Git 히스토리 모두에서 문자열을 찾았 습니까?

그러나 이것은 모든 파일을 검색합니다. 하나의 파일로 검색하고 싶습니다.


6
참고 -- filename로 하나의 파일로 제한하려는 경우 git 명령에 추가 할 수 있습니다 .
Karl Bielefeldt

답변:


234

이를 위해 -S 옵션을 사용하여 로그를 git 할 수 있습니다.

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

39
또는 git log -G'bar' -- foo.rb'bar'의 발생 횟수를 변경 한 커밋보다는 'bar'가 포함 된 diff를 검색합니다 (git-log 맨 페이지 참조).
Jakub Narębski

1
따옴표로 나를 위해 작동하지 않았으므로 bar-Sbar 를 검색하기 위해 사용해야 했습니다 . 어쩌면 Windows 명령 줄을 사용하여 나와 관련이있을 수 있습니다.
zbr

다시 말해서, -G정규식 검색을위한 것입니다. 이것도 훌륭한 참고 자료입니다 : stackoverflow.com/a/4472267/2586761
ptim

17

또는 아마도이 질문을 시도 할 수 있습니다 (관련 질문에서 모든 git history for string 검색 )

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

실제로 파일 내용을 찾고 bar 발생에 대해 메시지 / 패치를 커밋하지 않습니다.


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 명령에 대한 재정의가 있습니다 ( manual ).

$ git log Makefile      # commits that modify Makefile

그래서 당신은 사용할 수 있습니다 :

git log foo.rb | grep "bar"

2
고맙지 만 파일 소스의 기록이 아닌 커밋 기록 만 검색합니다.
JD Isaacks

2
또 다른 재정 실제로있어 해당 문자열 데이터 변경에 대한 검색 : 자식 로그 -S'foo () foo는 ( '문자열 일치하는 모든 파일 데이터를 추가하거나 제거 # 커밋') '
드미트리 레스 닉

1
--full-diff 매개 변수를 사용해 볼 수도 있습니다. 로그는 커밋 기록뿐만 아니라 diff도 표시합니다.
Dmitry Reznik

@DmitriyReznik - 분명히 --full-diff하지 않고 (같이 더 DIFF가 표시되지 않습니다)하지 작업을 수행 -p적어도 자식 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.