질문 : 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>
은 "Argument list too long"오류가 발생하면 작동합니다.
검색을 일부 하위 트리 (예 : "lib / util")로 제한하려면 rev-list
하위 명령과 grep
에도이를 전달해야합니다.
git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util
regexp
대한 모든 커밋 텍스트를 grep합니다.
두 명령 모두에서 경로를 전달하는 이유는 rev-list
lib/util
대한 모든 변경 사항이 발생한 개정 lib/util
에서만 검색 grep
에 전달해야하기 때문입니다.
다음 시나리오를 상상해보십시오. grep
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>
정규식 정규식과 일치하는 텍스트에 대한 모든 개정을 검색합니다.
git grep <regexp> $(git rev-list --all)
정규식 regexp와 일치하는 텍스트에 대해 rev1과 rev2 사이의 모든 개정을 검색합니다.
git grep <regexp> $(git rev-list <rev1>..<rev2>)
출처 : https://stackoverflow.com/questions/2928584/how-to-grep-search-committed-code-in-the-git-history
'개발관련 > Git' 카테고리의 다른 글
git branch, fork, fetch, merge, rebase 및 clone의 차이점 (0) | 2022.03.26 |
---|---|
git 태그 란 무엇이며 태그를 만드는 방법 및 git 원격 태그를 확인하는 방법 (0) | 2022.03.26 |
git에서 별칭 명령을 수행하는 방법 (0) | 2022.02.01 |
Git에서 태그가 가리키는 커밋을 확인하는 방법 (0) | 2022.01.17 |
이전 커밋에서 새 Git 브랜치를 생성하는 방법 (0) | 2022.01.17 |