2009-06-17 2 views
92

저장소에서 초기 커밋을 참조해야하는 스크립트가 있습니다. git은 특별한 참조 HEAD을 가지고 있지만 대응하는 TAIL을 갖고 있지 않습니다. git help rev-parse에서 나에게 도움이되는 것을 찾을 수 없습니다.초기 커밋을 참조하는 방법은 무엇입니까?

여기에 내가하고 싶은 내용은 다음과 같습니다 꽤 해키와 자식 로그의 출력이 변화에 따라 달라집니다

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

:

git show TAIL 

여기에 내가 가진 하나 개의 옵션입니다.

지금은 초기 커밋에 태그를 지정하고이를 내 refspec으로 사용합니다. 그러나, 나는 일반적인 도구를 공개하고 싶습니다. 그래서 좋은 선택은 아닙니다.

답변

110

스크립트에 대한 자식이 로그는 사용하지 마십시오 : 자식-REV-목록 또는 하나를 사용 지정된 사용자 정의 형식 ("--format = <STH>"옵션)와 자식을-로그인합니다.

질문에 또 다른 문제가 있습니다. TAIL root commit (parentless commit)가 저장소에 존재할 수 있습니다 (예 : 'html', 'man'및 ' git.git 저장소의 'todo'). 일반적으로 개별 프로젝트를 하나로 결합하거나 별도로 개발 한 하위 프로젝트의 하위 트리 병합을 사용하면 생깁니다.

예를 들어 git 저장소에는 git-gui, gitk (하위 트리 병합), gitweb (병합 됨, 더 이상 별도로 개발되지 않음), git 메일 도구 (프로젝트 기록 초기에 병합 됨) 빠른 수출 (실수로). 그것은 'html과'man '브랜치의 뿌리, 미리 생성 된 문서를 포함하는 "편의점"브랜치, TODO리스트와 스크립트가있는'todo '브랜치의 근원을 세지는 않습니다. 당신이 1.7.4.2 이상, 당신은 새로운 --max-parents 옵션을 사용할 수 있습니다 이눔 경우

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

:


당신은 모든 부모를 (루트)의 목록을 얻을 수 있습니다 사용하여 현재 지점에서 액세스 할 수 커밋

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

파이프가 없으며, 모든 루트가있다 :'git rev-list --max-parents = 0 HEAD' – wowest

+3

@wowest : IIRC IIRC 내가 이 대답을 쓰고 있었다. 업데이트를위한 Thansk! –

+0

나를 위해,'git rev-list HEAD | tail -n 1'과'git rev-list --max-parents = 0 HEAD'는 나와 같은 해시 값을 반환하지 않습니다. '--max-parents = 0'을 사용하는 것은 실제로 초기 커밋을 얻습니다. 후자가 더 신뢰할 만하다고 지적 할 것이라고 생각했습니다. – jbranchaud

21

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

+8

이렇게하면 * 꼬리 커밋 중 하나 *가 반환됩니다. 하나 이상의 루트 (parentless) 커밋이있을 수있다. –

관련 문제