Git : 전체 git 히스토리에 대해 지정된 파일의 한 줄에 대한 다양한 변경 사항을 모두 표시합니다. 같이 고유 식별자가 변수에 할당 된

나는 주위를 둘러 보았고 이것이 가능한지 확실하지 않지만 여기에 있습니다.

다음과 같이 고유 식별자가 변수에 할당 된 (javascript) 파일 (예 : /lib/client.js)이 있습니다.
var identifier = "SOME_IDENTIFIER";

식별자를 버전 번호처럼 생각할 수 있습니다. 주기적으로이 변수를 새 식별자로 변경합니다.

제가하고 싶은 것은 우리가 지금까지 사용한 모든 고유 식별자를 찾는 것입니다. git으로 어떻게 할 수 있습니까?

git 히스토리를 검색하고 일치하는 줄을 인쇄하는 방법이 있다고 생각합니다 "var identifier =". 이 목록의 중복을 수동으로 제거 할 수 있습니다.

어쨌든, 여기에 대한 통찰력을 고맙게 생각합니다. 감사.



답변

git 1.8.4 이후로 질문에 답하는 더 직접적인 방법이 있습니다.

그 라인을 가정하면 110선은 말하고 var identifier = "SOME_IDENTIFIER";다음이 작업을 수행 :

git log -L110,110:/lib/client.js

이것은 해당 코드 줄에 닿은 모든 커밋을 반환합니다.

[ Git 문서 ( “-L”명령 줄 매개 변수 참조)]


답변

git-log및에 대한 매뉴얼 페이지를 참조하십시오 gitdiffcore. 이 명령이 그렇게 할 것이라고 생각하지만 옳지 않을 수도 있습니다.

git log -G "var identifier =" file.js

편집 : 실제 줄을 표시하는 bash 스크립트에 대한 대략적인 시작이 있습니다. 이것은 당신이 찾고있는 것보다 더 많을 수 있습니다.

for c in $(git log -G "something" --format=%H -- file.js); do
    git --no-pager grep -e "something" $c -- file.js
done

git log -G흥미로운 커밋을 찾는 데 사용 하고 --format=%H커밋 해시 목록을 생성하는 데 사용 합니다. 그런 다음 각 흥미로운 커밋을 반복 git grep하여 커밋 해시로 시작하는 정규식을 포함하는 해당 커밋 및 파일의 줄을 표시하도록 요청 합니다.


수정 : 댓글에서 제안 하는 -G대신 사용하도록 변경되었습니다 -S.


답변

gitk로도이 작업을 수행 할 수 있습니다.

gitk file.js

“커밋”드롭 다운에서 “문자열 추가 / 제거 :”를 선택하고 그 옆의 텍스트 상자에 “var identifier =”를 입력하면 해당 문자열을 포함하는 행을 추가하거나 제거하는 모든 커밋이 강조 표시됩니다.


답변

@rob의 대답을 약간만 수정 git log하면 시각적 비교 만 있으면 기본적으로이 작업을 수행합니다.

git log -U0 -S "var identifier =" path/to/file

-U0패치 모드 ( -p)의 출력을 의미하며 패치 주변에 0 줄의 컨텍스트를 표시합니다.

지점 간에도이 작업을 수행 할 수 있습니다.

git log -U0 -S "var identifier =" branchname1 branchname2 -- path/to/file

diff 헤더를 억제하는 방법이있을 수 있지만 모르겠습니다.


답변

magit 에서는 다음 과 같이 할 수 있습니다.

l, =L

그런 다음 파일을 요청하고 시작, 끝 줄을 묻습니다.