etc./StackOverFlow

Git에서 현재 커밋에 대한 해시를 검색하는 방법은 무엇입니까?

청렴결백한 만능 재주꾼 2021. 12. 3. 08:21
반응형

질문자 :Sardaukar


나는 (지금은) Git 변경 세트를 TFS에 저장된 작업 항목에 연결하는 기능을 유지하고 싶습니다.

Git 변경 집합의 메시지에 작업 항목 식별자를 삽입할 수 있는 도구(Git의 후크 사용)를 이미 작성했습니다.

또한 사용자 지정 TFS 작업 항목 필드에 Git 커밋의 해시를 저장하고 싶습니다. 이 방법으로 TFS에서 작업 항목을 검사하고 작업 항목과 연결된 Git 변경 집합을 확인할 수 있습니다.

Git의 현재 커밋에서 해시를 어떻게 쉽게 검색할 수 있습니까?



임의의 확장된 객체 참조를 SHA-1로 바꾸려면 git-rev-parse 를 사용합니다. 예를 들면

 git rev-parse HEAD

또는

 git rev-parse --verify HEAD

다음과 같이 짧은 버전을 검색할 수도 있습니다.

 git rev-parse --short HEAD

참고 사항: 참조( 분기태그 )를 SHA-1로 바꾸고 싶다면 git show-refgit for-each-ref 있습니다.


Jakub Narębski

단축된 커밋 해시만 원하는 경우:

 git log --pretty=format:'%h' -n 1

또한 %H 사용하는 것은 긴 커밋 해시를 얻는 또 다른 방법 -n 1 -1 사용할 수 있습니다.


outofculture

다른 하나는 git log를 사용하는 것입니다.

 git log -1 --format="%H"

@outofculture 와 매우 유사하지만 조금 더 짧습니다.


Paul Pladijs

전체 SHA를 얻으려면:

 $ git rev-parse HEAD cbf1b9a1be984a9f61b79a05f23b19f66d533537

단축 버전을 얻으려면:

 $ git rev-parse --short HEAD cbf1b9a

Alexander

완전성을 위해 아직 아무도 제안하지 않았기 때문입니다. .git/refs/heads/master 단 한 줄 들어있는 파일입니다 : 최신의 해시에 커밋 master . 그래서 당신은 거기에서 그것을 읽을 수 있습니다.

또는 명령으로:

 cat .git/refs/heads/master

업데이트:

git은 이제 일부 헤드 참조를 /refs/heads/ 폴더에 파일로 저장하는 대신 pack-ref 파일에 저장하는 것을 지원합니다. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html


Deestan

커밋 해시

 git show -s --format=%H

약식 커밋 해시

 git show -s --format=%h

-s 플래그는 --no-patch 와 동일하며 "차이 출력 억제"를 나타냅니다.

더 많은 git show 예제를 보려면 여기를 클릭하십시오.


ecwpz91

항상 git describe 도 있습니다. 기본적으로 다음을 제공합니다.

 john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe --always release-0.19-11-g7a68a75

John Tyree

git rev-list --max-count=1 HEAD


Robert Munteanu

스크립트 중에 해시를 변수에 저장해야 하는 경우 다음을 사용할 수 있습니다.

 last_commit=$(git rev-parse HEAD);

또는 처음 10자만 원하는 경우(github.com처럼)

 last_commit=$(git rev-parse --short=10 HEAD);

Henk

당신이 그것을 할 수 있는 아주 해키한 방법을 원한다면:

 cat .git/`cat .git/HEAD | cut -d \ -f 2`

ref: {path from .git} 형식으로 .git/HEAD에 HEAD의 위치를 저장합니다. 이 명령은 그것을 읽고 "ref: "를 잘라낸 다음 그것이 가리키는 파일을 읽습니다.

이것은 물론 HEAD가 "ref:..."가 아니라 해시 자체가 되기 때문에 분리 헤드 모드에서는 실패할 것입니다. - 라이너. 세미콜론이 속임수라고 생각하지 않는다면...

 HASH="ref: HEAD"; while [[ $HASH == ref\:* ]]; do HASH="$(cat ".git/$(echo $HASH | cut -d \ -f 2)")"; done; echo $HASH

Fordi

내가 아는 가장 간결한 방법:

 git show --pretty=%h

해시의 특정 자릿수를 원하면 다음을 추가할 수 있습니다.

 --abbrev=n

Brian Peterson

조금 더 다른 것이 필요했습니다. 커밋의 전체 sha1을 표시하지만 작업 디렉토리가 깨끗하지 않은 경우 끝에 별표를 추가합니다. 여러 명령을 사용하지 않으려면 이전 답변의 옵션이 작동하지 않습니다.

다음은 하나의 라이너입니다.
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
결과: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*

설명: (주석이 있는 태그를 사용하여) 현재 커밋을 설명하지만 "NOT A TAG"가 포함된 태그만 사용합니다. 태그는 공백을 가질 수 없으므로 이것은 태그와 일치하지 않으며 결과를 표시하기를 원하기 때문에 --always , 명령은 커밋의 전체( --abbrev=0 ) sha1을 표시하고 작업 디렉토리가 --dirty 입니다.

별표를 추가하지 않으려면 이전 답변의 다른 모든 명령처럼 작동합니다.
git describe --always --abbrev=0 --match "NOT A TAG"
결과: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe


Rado

모든 멋진 세부 사항을 기억할 필요가 없도록 별칭을 원할 수도 있습니다. 아래 단계 중 하나를 수행한 후 간단히 입력할 수 있습니다.

 $ git lastcommit 49c03fc679ab11534e1b4b35687b1225c365c630

허용된 답변 에 대한 후속 조치는 다음 두 가지 방법으로 설정합니다.

1) 전역 구성(내 원래 답변)을 편집하여 git에게 명시적인 방법을 가르칩니다.

 # open the git config editor $ git config --global --edit # in the alias section, add ... [alias] lastcommit = rev-parse HEAD ...

2) 또는 최근 Adrien이 언급한 대로 git에게 단축키를 가르치는 단축키가 마음에 들면:

 $ git config --global alias.lastcommit "rev-parse HEAD"

이제부터 git lastcommit 을 사용하여 마지막 커밋의 해시를 표시합니다.


miraculixx

git show-ref --head --hash head

그러나 속도 를 원한다면 Deestan이 언급한 접근 방식

 cat .git/refs/heads/<branch-name>

지금까지 여기에 나열된 다른 방법보다 훨씬 빠릅니다.


Dennis

다음은 git 파일에서 직접 읽기를 사용하는 Bash 셸의 한 줄짜리입니다.

 (head=($(<.git/HEAD)); cat .git/${head[1]})

git 루트 폴더에서 위의 명령을 실행해야 합니다.

이 방법은 저장소 파일이 있지만 git 명령이 설치되지 않은 경우에 유용할 수 있습니다.

작동하지 않으면 .git/refs/heads 폴더에서 어떤 종류의 헤드가 있는지 확인하십시오.


kenorb

".gitconfig"파일의 홈 디렉토리에 다음을 추가하십시오.

 [alias] sha = rev-parse HEAD

그러면 기억하기 쉬운 명령이 생깁니다.

 $ git sha 59fbfdbadb43ad0b6154c982c997041e9e53b600

jo_

git bash에서 $ git log -1을 실행하기만 하면 됩니다.

명령 다음에 이러한 행이 표시됩니다.

 commit d25c95d88a5e8b7e15ba6c925a1631a5357095db .. (info about your head) d25c95d88a5e8b7e15ba6c925a1631a5357095db, is your SHA for last commit.

Batty

git rev-parse HEAD 가 트릭을 수행합니다.

실제 브랜치를 저장하는 것보다 나중에 체크아웃하기 위해 저장해야 하는 경우:

 cat .git/HEAD

출력 예:

 ref: refs/heads/master

구문 분석:

 cat .git/HEAD | sed "s/^.\+ \(.\+\)$/\1/g"`

Windows가 있는 경우 wsl.exe 사용을 고려할 수 있습니다.

 wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g"

산출:

 refs/heads/master

이 값은 나중에 git checkout에 사용될 수 있지만 SHA를 가리키게 됩니다. 이름으로 실제 현재 분기를 가리키도록 하려면 다음을 수행하십시오.

 wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g" | wsl sed "s/^refs\///g" | wsl sed "s/^heads\///g"

산출:

 master

Serg

다음은 또 다른 직접 액세스 구현입니다.

 head="$(cat ".git/HEAD")" while [ "$head" != "${head#ref: }" ]; do head="$(cat ".git/${head#ref: }")" done

이것은 로컬 패키지 아카이브에 유용한 http에서도 작동합니다.

 head="$(curl -s "$baseurl/.git/HEAD")" while [ "$head" != "${head#ref: }" ]; do head="$(curl -s "$baseurl/.git/${head#ref: }")" done

Daniel Alder

다음은 이를 수행하는 또 다른 방법입니다. :)

 git log | grep -o '\w\{8,\}' | head -n 1

Marcelo Lazaroni

출처 : http:www.stackoverflow.com/questions/949314/how-to-retrieve-the-hash-for-the-current-commit-in-git

반응형