Programing

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

lottogame 2020. 3. 20. 08:14
반응형

특정 문자열에 대해 저장소의 모든 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

또는 특정 문자열의 변경 사항을 검색하려면 pickaxe 검색 옵션 인 "-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는 할 수 없습니다. -S는 문자열을 포함하는 총 줄 수가 변경된 경우에만 알려줍니다 (예 : 문자열 추가 / 제거).

마지막으로 gitk를 사용하여 댕글 링 커밋을 시각화 할 수 있습니다 :

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

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


Mercurial에서는 hg log --keyword커밋 메시지에서 키워드 hg log --user를 검색하고 특정 사용자를 검색하는 데 사용합니다. hg help log로그를 제한하는 다른 방법을 참조하십시오 .


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


요약

git grepgit log --grep모두 지정된 패턴과 일치하는 행을 찾기 때문에 행 지향적 입니다.

패턴 중 하나 (내재적 OR 의미) 와 일치 하는 커밋을 찾기 위해 git log --grep=<foo> --grep=<bar>(또는 git log --author=<foo> --grep=<bar>내부적으로 2로 변환되는 --grep)를 사용할 수 있습니다 .

라인 지향되는 때문에 유용 AND 의미를 사용하는 것이 git log --all-match --grep=<foo> --grep=<bar>발견 커밋 즉 갖는 제 광고 매칭 라인 초 대체로 일치.

으로 git grep여러 패턴 (이용해야하는 모든 결합 할 수 있습니다 -e <regexp>와 함께 양식) --or(기본값), --and, --not, (). grep --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매뉴얼 페이지에 문서화 된 옵션 을 승인합니다 git rev-list.

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

따라서 예를 들어 git log -Sstring --all언급 string하고 분기 또는 태그에서 액세스 할 수있는 모든 커밋을 표시합니다 (댕글 링 커밋은 적어도 태그로 이름이 지정된 것으로 가정합니다).


Mercurial을 사용하면

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

검색되는 개정 범위를 좁히는 다른 옵션이 있습니다.


git에 대해 모르지만 Mercurial에서는 hg 로그의 출력을 sed / perl / whatever 스크립트에 파이프하여 원하는 것을 검색합니다. 원하는 경우 템플릿이나 스타일을 사용하여 hg 로그의 출력을 사용자 정의하여보다 쉽게 ​​검색 할 수 있습니다.

이것은 repo에있는 모든 지명 된 지점을 포함합니다. 머큐리얼에는 매달린 얼룩 모양이 없습니다.


vim 사용자 인 경우 tig (apt-get install tig)를 설치하고 동일한 명령을 사용하여 vim을 검색 할 수 있습니다.

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


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


git의 한 명령은 문자열을 찾는 것이 훨씬 쉽다고 생각합니다.

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

힘내 2.0.4에서 작동

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

반응형