분기가 적고 매달려있는 커밋이있는 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 grep 과 git 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 로그의 출력을 사용자 정의하여보다 쉽게 검색 할 수 있습니다.
여기에는 리포지토리의 모든 명명 된 분기가 포함됩니다. 머큐리얼에는 매달린 얼룩 모양이 없습니다.