programing

초기 커밋을 어떻게 참조합니까?

closeapi 2023. 9. 18. 21:27
반응형

초기 커밋을 어떻게 참조합니까?

저장소의 초기 커밋을 참조해야 하는 스크립트가 있습니다. 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의 출력이 변하지 않는 것에 달려있습니다.

지금은 초기 커밋에 태그를 달고 그것을 나의 refspec으로 사용합니다.하지만 일반적인 툴을 출시하고 싶어서 좋은 옵션은 아닙니다.

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

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

예를 들어 git 저장소에는 git-gui, gitk(서브트리 병합), gitweb(병합되어 더 이상 별도로 개발되지 않음), git 메일 도구(프로젝트 역사상 매우 초기에 병합됨), p4-fast-export(어쩌면 우발적일 수 있음)의 6가지 루트 커밋이 있습니다.즉, '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 1더 안정적인 선택입니다.

여기서 뭘 하려는 건지는 모르겠지만 일부 git 명령어는--root예를 들어 커밋 트리의 루트를 참조하기 위해 옵션으로 사용할 수 있습니다.

git rebase --interactive --root main

병합의 첫 번째 부모를 주요 개발 라인이라고 가정하면 다음과 같습니다.

git rev-list --reverse --topo-order --first-parent HEAD | sed 1q

여러 개의 초기(orphan)가 있을 수 있지만, 이러한 커밋은 사용할 수 있는 참조에서 여전히 도달할 수 있습니다.

git rev-list --all --max-parents=0

아니면

git rev-list --reflog --max-parents=0

하지만 도달할 수 없는 커밋을 포함한 루트 커밋을 찾아야 한다면,git fsck사용 가능:

git fsck --root --no-dangling

--no-danglingoption은 dangling commit에 대한 경고 메시지를 억제하여 스크립트에서 출력을 더 쉽게 처리할 수 있도록 합니다.

저장소에 대한 첫 번째 커밋을 얻으려면 다음 명령을 실행합니다.

 git rev-list --oneline HEAD | tail -n 1

언급URL : https://stackoverflow.com/questions/1006775/how-to-reference-the-initial-commit

반응형