초기 커밋을 참조하는 방법?


131

리포지토리의 초기 커밋을 참조 해야하는 스크립트가 있습니다. git에는 특별한 참조 HEAD가 있지만 해당하는 것은 없습니다 TAIL. 나는 git help rev-parse나를 도울 것 같은 것을 찾을 수 없습니다 .

내가하고 싶은 일은 다음과 같습니다.

git show TAIL

내가 가진 하나의 옵션은 다음과 같습니다.

git show `git log --reverse | if read a commit ; then echo $commit ; fi`

그것은 꽤 해키이며 git log의 출력에 영향을 미치지 않습니다.

지금은 초기 커밋에 태그를 지정하고이를 내 참조 사양으로 사용합니다. 그러나 일반적인 도구를 출시하고 싶기 때문에 훌륭한 옵션은 아닙니다.

답변:


151

스크립팅에 git-log를 사용하지 마십시오. git-rev-list또는 git-log지정된 사용자 정의 형식 ( --format=*<sth>*옵션)을 사용하십시오.

질문에 추가 문제가 있습니다 : 저장소에 하나 이상의 TAIL 루트 커밋 (부모 커밋) 이 존재할 수 있습니다 (git.git의 'html', 'man'및 'todo'와 같은 연결되지 않은 분기를 할인하더라도) 저장소). 이는 대개 하나의 프로젝트에서 개별 프로젝트를 결합하거나 개별적으로 개발 된 하위 프로젝트의 하위 트리 병합을 사용하여 발생합니다.

예를 들어 git 저장소에는 6 개의 루트 커밋이 있습니다 : git-gui, gitk (하위 트리 병합), gitweb (병합, 더 이상 별도로 개발되지 않음), git 메일 도구 (프로젝트 히스토리 초기에 병합) 및 p4-fast-export ( 우연히). 그것은 'html과'man '브랜치의 뿌리, 미리 생성 된 문서를 포함하는 "편의성"브랜치, TODO리스트와 스크립트가있는'todo '브랜치를 세지 않습니다.


git 1.7.4.2 이상인 경우 다음 --max-parents옵션을 사용할 수 있습니다 .

$ git rev-list --max-parents=0 HEAD

그렇지 않으면 다음을 사용하여 현재 브랜치에서 액세스 할 수있는 모든 부모없는 (루트) 커밋 목록을 얻을 수 있습니다.

$ git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"

나에게 git rev-list HEAD | tail -n 1and git rev-list --max-parents=0 HEAD는 동일한 해시 값을 반환하지 않습니다. 를 사용하는 사람 --max-parents=0은 실제로 초기 커밋을 받고 있습니다. 나는 후자가 더 신뢰할만한 것처럼 보일 것이라고 생각했습니다.
jbranchaud

1
@Treebranch 이상한 타임 스탬프로 커밋하면 발생할 수 있습니다. 추가 --topo-order받는 것은 rev-list나는 생각하지만, 그 문제를 해결해야한다 --max=parents=0대답이 가장 좋습니다.
jthill

35

git rev-list HEAD | tail -n 1 보다 안정적인 옵션입니다.


14
이것은 꼬리 커밋 중 하나 를 반환합니다 . 하나 이상의 루트 (부모없는) 커밋이있을 수 있습니다.
Jakub Narębski

이 답변은 완벽하게 작동하고 단 하나의 커밋을 git rev-list --max-parents=0 HEAD반환 했지만 3 개의 커밋을 반환했습니다.
protoEvangelion

tail은 Windows에 기본적으로있는 명령이 아닙니다-Windows의 GitBash에서 작동합니다. :)
Johny Skovdal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.