source

저장소에서 모든 Git 및 Mercurial 커밋을 검색하여 특정 문자열을 찾는 방법은 무엇입니까?

factcode 2023. 5. 4. 20:36
반응형

저장소에서 모든 Git 및 Mercurial 커밋을 검색하여 특정 문자열을 찾는 방법은 무엇입니까?

나는 가지가 거의 없고 매달린 커밋이 있는 Git 저장소를 가지고 있습니다.저장소에 있는 모든 커밋에서 특정 문자열을 검색하려고 합니다.

나는 역사상 모든 커밋의 로그를 얻는 방법을 알고 있지만, 여기에는 나뭇가지나 달랑거리는 방울이 포함되지 않고 HEAD의 이력만 포함됩니다.저는 그들 모두가 잘못 배치된 특정한 약속을 찾도록 하고 싶습니다.

Mercurial에서 어떻게 하는지도 알고 싶습니다. 전환을 고려하고 있기 때문입니다.

다음을 사용하여 커밋을 표시할 수 있습니다.git log -g.

-g, --walk-reflogs
 Instead of walking the commit ancestry chain, walk reflog entries from
 the most recent one to older ones. 

따라서 이렇게 하면 커밋 메시지에서 매달린 특정 문자열을 찾을 수 있습니다.

git log -g --grep=search_for_this

또는 특정 문자열에 대한 변경 내용을 검색하려면 곡괭이 검색 옵션 "-S"를 사용할 수 있습니다.

git log -g -Ssearch_for_this
# this also works but may be slower, it only shows text-added results
git grep search_for_this $(git log -g --pretty=format:%h)

Git 1.7.4는 -G 옵션을 추가하여 -G<regexp>를 전달하여 <regexp>가 포함된 줄이 언제 이동되었는지를 찾을 수 있게 하며, -S는 문자열이 포함된 줄의 총 수가 변경되었을 때만 알려줍니다(즉, 문자열 추가/제거).

마지막으로 gitk를 사용하여 다음을 사용하여 매달린 커밋을 시각화할 수 있습니다.

gitk --all $(git log -g --pretty=format:%h)

그런 다음 검색 기능을 사용하여 위치가 잘못된 파일을 찾습니다.누락된 커밋이 "만료"되지 않고 가비지 수집된 것으로 가정하는 이러한 모든 작업은 30일 동안 매달려 있다가 reflog를 만료하거나 만료되는 명령을 실행할 경우 발생할 수 있습니다.

사용하는 머큐리얼에서hg log --keyword커밋 메시지에서 키워드를 검색하고hg log --user특정 사용자를 검색합니다.hg help log로그를 제한하는 다른 방법에 대해 설명합니다.

사용에 대한 richq 답변 외에도git log -g --grep=<regexp>또는git grep -e <regexp> $(git log -g --pretty=format:%h)현재 깃 관리자인 주니오 C 하마노의 다음 블로그 게시물을 보십시오.


요약

git grepgit log --grep는 지정된 패턴과 일치하는 선을 찾는 선 지향적입니다.

사용할 수 있습니다.git log --grep=<foo> --grep=<bar>(또는)git log --author=<foo> --grep=<bar>그것은 내부적으로 두 개로 해석됩니다.--grep패턴(암묵적 OR 의미) 중 하나와 일치하는 커밋을 찾습니다.

라인 지향적이기 때문에 유용하고 의미론적인 것은git log --all-match --grep=<foo> --grep=<bar>첫 번째 행과 두 번째 행이 일치하는 커밋을 찾습니다.

와 함께git grep여러 패턴을 결합할 수 있습니다(모두 사용해야 함).-e <regexp>과 함께--or (으),--and,--not,(그리고.)그렙을 위하여--all-match파일에 각 대안과 일치하는 행이 있어야 함을 의미합니다.

rq의 답변을 바탕으로, 저는 이 라인이 제가 원하는 것을 한다는 것을 발견했습니다.

git grep "search for something" $(git log -g --pretty=format:%h -S"search for something")

커밋 ID, 파일 이름을 보고하고 다음과 같이 일치하는 행을 표시합니다.

91ba969:testFile:this is a test

이것이 표준 git grep 명령에 포함되는 좋은 옵션이라는 것에 동의하는 사람이 있습니까?

참를인사는모명든령다수다락니합음을은을 합니다.--all 페에 문된옵의 man git rev-list다음과 같이:

   --all
       Pretend as if all the refs in $GIT_DIR/refs/ are listed on the
       command line as <commit>.

예를 들면 그서예를들면래,면▁so.git log -Sstring --all 언된모든커표시다니합밋을급▁that다▁commits▁mention를 언급하는 모든 커밋이 됩니다.string분기 또는 태그에서 액세스할 수 있습니다(최소한 태그로 이름이 지정되어 있어야 합니다).

머큐리얼을 사용하면 다음을 수행할 수 있습니다.

$ hg grep "search for this" [file...]

검색되는 수정사항의 범위를 좁히는 다른 옵션이 있습니다.

git에 대해서는 모르지만, Mercurial에서 나는 당신이 찾고 있는 것이 무엇이든 검색하기 위해 hglog의 출력을 sed/perl/any 스크립트에 파이프로 연결할 것입니다.원하는 경우 템플릿이나 스타일을 사용하여 hg 로그의 출력을 사용자 지정하여 검색하기 쉽게 할 수 있습니다.

여기에는 레포의 명명된 모든 분기가 포함됩니다.머큐리얼은 허풍을 떨게 하는 것과 같은 것을 가지고 있지 않습니다.

vim 사용자인 경우 tig(apt-get install tig)를 설치하고 /, 같은 명령을 사용하여 vim에서 검색할 수 있습니다.

https://blogs.atlassian.com/2013/05/git-tig/

아직 언급되지 않은 해결책을 하나 더 추가하자면, gitg의 그래픽 검색 상자를 사용하는 것이 저에게 가장 간단한 해결책이라고 말해야 했습니다.첫 번째 항목이 선택되고 Ctrl-G로 다음 항목을 찾을 수 있습니다.

문자열을 찾는 것이 훨씬 쉽다고 생각하는 명령어 하나:

git log --pretty=oneline --grep "string to search"

Git 2.0.4에서 작동합니다.

언급URL : https://stackoverflow.com/questions/746684/how-to-search-through-all-git-and-mercurial-commits-in-the-repository-for-a-cert

반응형