특정 단어에 대한 Git 커밋 디프 또는 내용을 grep하는 방법
Git 코드 저장소에서 특정 단어를 포함하는 모든 커밋을 나열하려고 합니다.해봤습니다.
git log -p | grep --context=4 "word"
하지만 반드시 파일 이름을 돌려주지는 않습니다(제가 검색한 단어에서 5줄 이상 떨어져 있지 않은 경우).저도 노력했습니다.
git grep "word"
현재 파일만 제공하고 기록은 제공하지 않습니다.
특정 단어의 변경 내용을 추적할 수 있도록 전체 기록을 검색하려면 어떻게 해야 합니까?변경 사항을 추적하기 위해 내 코드베이스에서 단어가 발생하는지 검색하려고 합니다(파일 기록에서 검색).
커밋 메시지에 지정된 단어가 포함된 모든 커밋을 찾으려면 다음을 사용합니다.
$ git log --grep=word
파일 내용에서 "word"가 추가되거나 제거된 모든 커밋을 찾으려면(정확하게는 "word"의 발생 횟수가 변경된 경우), 즉 커밋 내용을 검색하고 다음을 사용하여 이른바 "pickax" 검색을 사용합니다.
$ git log -Sword
현대 Git에도 또한 있습니다.
$ git log -Gword
추가되거나 제거된 줄이 "단어"와 일치하는 차이를 찾습니다(내용도 커밋).
주의해야 할 몇 가지 사항:
-G
기본적으로 정규식을 허용하는 반면-S
문자열을 허용하지만 다음을 사용하여 정규식을 허용하도록 수정할 수 있습니다.--pickaxe-regex
.-S
는 " "word"는 "word"의 발생 횟수를 찾습니다.-G
diff.diff에서 "word.- 은 즉을 합니다.
-S<regex> --pickaxe-regex
그리고.-G<regex>
정확히 같은 일을 하지 마세요.
설명서에는 다음과 같은 차이점이 잘 설명되어 있습니다.
▁diffe의 차이를 하기 위해.
-S<regex> --pickaxe-regex
그리고.-G<regex>
동일한 파일에 다음과 같은 차이가 있는 커밋을 고려합니다.+ 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
(해당 문자열의 발생 횟수가 변경되지 않았기 때문에) 그렇지 않습니다.
하면 된 커밋이 되지만, 커밋의 내용을 검어가포커표시만지되이밋, 해당커의다사다수있니습용을 사용할 수 .--patch
:
$ git log -G"searchTerm" --patch
다음으로 파이프를 연결할 수 있습니다.grep
출력을 분리하여 해당 검색어와의 커밋 차이 행을 표시합니다.일반적인 사용 사례는 주어진 커밋 이후의 커밋과 다음을 포함하는 커밋에서 해당 검색 용어와 다른 행을 표시하는 것입니다.3b5ab0f2a1
예에서는 - so 에예는서 - 다과같다니습이음▁in다같▁-.
$ git log 3b5ab0f2a1^.. -G"searchTerm" --patch | grep searchTerm
git log
는 "포함한 변경 이 있는 git log -Sword
많은 실험을 거친 후, 저는 다음을 추천할 수 있습니다. 주어진 정규 표현을 포함하는 선을 도입하거나 제거하는 커밋을 보여주고 각각의 텍스트 변경 사항을 표시하고 단어를 추가하고 제거하는 색상을 표시합니다.
git log --pickaxe-regex -p --color-words -S "<regexp to search for>"
하지만 달리는 데 시간이 좀 걸립니다... ;-)
이를 위한 또 다른 방법/구문법은 다음과 같습니다.git log -S "word"
와 같이 예를 이같이예검수있다니습할색와를▁for▁example다▁like니▁search를 검색할 수 있습니다.git log -S "with whitespaces and stuff @/#ü !"
다음 명령을 사용할 수 있습니다.
git log --patch --color=always | less +/searching_string
는사용을 사용합니다.grep
다음과 같은 방법으로:
git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'
검색할 상위 디렉토리에서 이 명령을 실행합니다.
정규식에서 부울 커넥터를 사용하는 방법
git log --grep '[0-9]*\|[a-z]*'
이 정규식은 커밋 메시지에서 [0-9]* 또는 [a-z]* 정규식을 검색합니다.
이 기능은 BFG(Git filter branch - git-filter-branch와 혼동하지 않음) 및 git-filter-repo와 함께 사용할 때 유용합니다.파일 경로만 제공하므로 방금 언급한 두 가지 도구 중 하나에 파일 경로를 입력할 수 있습니다.
A. 상대적, 고유, 정렬된 경로:
# Get all unique filepaths of files matching 'password'
# Source: https://stackoverflow.com/a/69714869/10830091
git rev-list --all | (
while read revision; do
git grep -F --files-with-matches 'password' $revision | cat | sed "s/[^:]*://"
done
) | sort | uniq
B. 고유하고 정렬된 파일 이름(경로 아님):
# Get all unique filenames matching 'password'
# Source: https://stackoverflow.com/a/69714869/10830091
git rev-list --all | (
while read revision; do
git grep -F --files-with-matches 'password' $revision | cat | sed "s/[^:]*://"
done
) | xargs basename | sort | uniq
이 두 번째 명령은 파일 이름만 허용하고 repo-relative/system-절대 경로는 허용하지 않으므로 BFG에 유용합니다.
여기 있습니다.이 Bash 스니펫을 사용하여 저에게 끼친 고통을 즐기십시오.나는 배시가 싫어, 그런데 왜 계속 사용하는 거지?
해부학
파일 이름/경로만 가져오기
다음 옵션의 의미는 동일합니다(git-rep 설명서).
-l
--files-with-matches
--name-only
일치하는 모든 행을 표시하는 대신 견적서 차단이 포함된 파일 이름만 표시
패턴이 A입니까?정규판 대 사건B. 고정 문자열?
에 대해서는-F
패턴 해석을 위해 정규식 대신 고정 문자열을 사용하는 것을 의미합니다.출처.
또 는 여에포또함다유노다같다니습음과트는용기한을 넣을 수 .-i
또는--ignore-case
대소문자를 구분하지 않습니다.
그 멍청한 선행 커밋 해시를 제거합니다.
sed "s/[^:]*://"
출처.
고유한 경로를 확보하십시오!
| sort | uniq
중복 경로를 원하는 사용자너도, 나도!오, 보세요, 그들도 분류되어 있어요!즐거운 시간 되세요.
例처:나.내가 하는 한 .저는 이것을 제가 기억하는 한 오랫동안 사용해 왔습니다.(man sort
그리고.man uniq
)
경로가 없는 파일 이름은 어떻습니까?
xargs basename
당신은 생각할 것입니다.| basename
효과는 있겠지만, 안 됩니다.입력 표준 입력을 사용하지 않고 명령줄 인수로 사용할 수 있습니다.여기 그것에 대한 설명이 있습니다.계산해 보세요! basename
기본적으로 선행 경로 없이 스템 파일 이름을 반환합니다. man basename
.
방법 A의 경우, 저는 상대적인 경로가 아닌 절대 경로를 원합니다.
물론이죠, 그냥 탁탁 치세요.realpath
마지막에이와 같은 경우:
) | sort | uniq | xargs realpath
물론 당신은 사용해야 합니다 왜냐하면realpath
는 입력에 표준 입력을 사용하지 않습니다.명령줄 인수를 사용합니다. ㅠㅠ처럼.dirname
.
영감
- 이 멋진 대안을 확인해 보세요.
- 모든 Git 기록에서 문자열 검색
- Gitgrep만 사용하는 파일 이름
vim-fugitive는 Vim에서 그런 종류의 검사에 다용도입니다.
사용하다:Ggrep
그러기 위해서는.자세한 내용은 vim-fugitive를 설치하고 튜토리얼을 참조하십시오.:help Grep
그리고 이번 에피소드는 여러분이 이 모든 것을 할 수 있도록 도와줄 것입니다.
Git 내역에서 중요한 데이터를 제거하기 위해 검색하려면(이것이 내가 여기에 도착한 이유입니다), 이를 위한 도구가 있습니다.GitHub은 해당 문제에 대한 전용 도움말 페이지입니다.
기사의 요지는 다음과 같습니다.
BFG Repo-Cleaner는 불필요한 데이터를 제거하기 위한 git 필터 분기의 더 빠르고 간단한 대안입니다.예를 들어 중요한 데이터가 있는 파일을 제거하고 최근 커밋을 그대로 유지하려면 다음을 실행합니다.
bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA
암호에 나열된 모든 텍스트를 바꿉니다.txt 저장소의 기록에서 찾을 수 있는 위치에서 다음을 실행합니다.
bfg --replace-text passwords.txt
전체 사용 및 다운로드 지침은 BFG Repo-Cleaner 설명서를 참조하십시오.
언급URL : https://stackoverflow.com/questions/1337320/how-to-grep-git-commit-diffs-or-contents-for-a-certain-word
'programing' 카테고리의 다른 글
프로젝트 파일을 버전 관리 상태로 유지해야 합니까? (0) | 2023.04.29 |
---|---|
장식품은 언제 사용해야 합니까? (0) | 2023.04.29 |
전체 배열을 지우는 방법은 무엇입니까? (0) | 2023.04.29 |
셸 스크립팅에서 문자열의 처음 두 문자를 추출하려면 어떻게 해야 합니까? (0) | 2023.04.29 |
한 디브를 다른 디브 위에 덧씌우는 방법 (0) | 2023.04.29 |