programing

특정 단어에 대한 Git 커밋 디프 또는 내용을 grep하는 방법

elseif 2023. 4. 29. 08:48

특정 단어에 대한 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"의 발생 횟수를 찾습니다.-Gdiff.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.

영감

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