prosource

Git에서 현재 커밋에 대한 해시를 얻으려면 어떻게 해야 합니까?

probook 2023. 4. 28. 21:07
반응형

Git에서 현재 커밋에 대한 해시를 얻으려면 어떻게 해야 합니까?

Git에서 현재 커밋의 해시를 얻으려면 어떻게 해야 합니까?

확장 개체 참조를 해시로 변환하려면 다음을 사용합니다.

git rev-parse HEAD

또는

git rev-parse --verify HEAD

짧은 해시 검색하기

git rev-parse --short HEAD

참조(예: 분기 태그)를 해시로 변환하려면 다음을 사용합니다.git show-ref그리고.git for-each-ref.

해시를 단된커가면려오를 합니다.%h형식 지정자:

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

%H긴 커밋 해시를 나타냅니다.또한.-1의 대신에 직접 사용할 수 있습니다.-n 1.

Git log를 사용하는 다른 하나:

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

그것은 @ofculture의 것과 매우 유사하지만 조금 더 짧습니다.

전체 SHA를 가져오는 방법

$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

단축된 버전을 가져오는 방법

$ git rev-parse --short HEAD
cbf1b9a

커밋 해시

git show -s --format=%H

약식 커밋 해시

git show -s --format=%h

-s플래그가 다음과 같습니다.--no-patch① "Suppress diff output"은 "Suppress diff output"입니다.

자세한 내용은 여기를 클릭하십시오.git show 예문들

아직 아무도 제안하지 않았기 때문에 완성도를 위해서입니다. .git/refs/heads/master는 한입니다: " " " 에 대한 커밋의 입니다.master그래서 당신은 거기서 그것을 읽을 수 있었습니다.

또는 명령으로 다음을 수를 입력합니다.

cat .git/refs/heads/master

업데이트:

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

항상 있습니다.git describe뿐만아라. 으로 --기적으로본▁-- --를 합니다.

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

사용하다git rev-list --max-count=1 HEAD

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

last_commit=$(git rev-parse HEAD);

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

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

만약 당신이 그것을 하기 위해 초해키적인 방법을 원한다면:

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

합니다.ref: {path from .git}이 명령은 이를 읽고 "ref:"를 잘라낸 다음 가리키는 모든 파일을 읽습니다.

헤드가 "ref:..."가 아니라 해시 자체일 것이기 때문에 이것은 물론 분리 헤드 모드에서는 실패할 것입니다. 하지만 알다시피, 당신은 당신의 bash 한 줄기에 그렇게 많은 스마트를 기대하지 않을 것입니다.세미콜론이 부정행위를 한다고 생각하지 않는다면, 그래도...

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

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

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

설명: 현재 커밋을 설명합니다(주석 태그 사용). 그러나 "태그 없음"이 포함된 태그만 포함됩니다.공백을 할 수 없기 , 입니다.--always back 는 full back)을 합니다.--abbrev=0이며, 가 )일 됩니다.--dirty.

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

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

이 값은 나중에 체크아웃할 때 사용할 수 있지만 SHA를 가리킵니다.이름으로 실제 현재 분기를 가리키도록 하려면 다음을 수행합니다.

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

출력:

master

내가 아는 가장 간단한 방법은:

git show --pretty=%h 

해시의 특정 자릿수를 원하는 경우 추가할 수 있습니다.

--abbrev=n

아마도 당신은 모든 세부사항을 기억할 필요가 없도록 가명을 원할 것입니다.다음 단계 중 하나를 수행한 후에는 간단히 다음을 입력할 수 있습니다.

$ git lastcommit
49c03fc679ab11534e1b4b35687b1225c365c630

승인된 답변에 대한 후속 조치로 이를 설정하는 두 가지 방법이 있습니다.

글로벌 구성을 편집하여 명시적인 방법으로 git를 티칭합니다(원래 답변).

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

또는 Adrien이 최근 언급한 바와 같이 바로 가기를 가르쳐 주는 바로 가기를 좋아한다면 다음과 같습니다.

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

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

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

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

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

이 방법은 리포지토리 파일이 있을 때 유용할 수 있지만git명령이 설치되지 않았습니다.

작동하지 않으면 체크인합니다..git/refs/heads어떤 종류의 머리를 가지고 계십니까?

git show-ref --head --hash head

하지만 속도를 높이려면 디스탄이 언급한 접근법은

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

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

.gitconfig 파일의 홈 페이지에 다음을 추가합니다.

[alias]
sha = rev-parse HEAD

기억하기 쉬운 명령을 사용할 수 있습니다.

$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600

git bash에서 $git log -1을 실행합니다.

당신의 명령 뒤에 있는 이 행들을 보게 될 것입니다.

commit d25c95d88a5e8b7e15ba6c925a1631a5357095db .. (info about your head)

d25c95d88a5e8b7e15ba6c925a1631a5357095db, is your SHA for last commit.

메인 깃 레포와 서브 모듈의 예쁜 인쇄물:

echo "Main GIT repo:"
echo $(git show -s --format=%H) '(main)'
echo "Sub-modules:"
git submodule status | awk '{print $1,$2}'

출력 예:

3a032b0992d7786b00a8822bbcbf192326160cf9 (main)
7de695d58f427c0887b094271ba1ae77a439084f sub-module-1
58f427c0887b01ba1ae77a439084947de695d27f sub-module-2
d58f427c0887de6957b09439084f4271ba1ae77a sub-module-3

파이썬으로 하는 방법(@kenorb의 bash 답변 기반)

def get_git_sha():
    # Which branch are we on?
    branch = open(".git/HEAD", "r").read()

    # Parse output "ref: refs/heads/my_branch" -> my_branch
    branch = branch.strip().split("/")[-1]

    # What's the latest commit in this branch?
    return open(f".git/refs/heads/{branch}").read().strip()

다른 직접 액세스 구현은 다음과 같습니다.

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

이는 로컬 패키지 보관소에 유용한 http에서도 작동합니다(공용 웹 사이트의 경우 .git 디렉토리에 액세스하는 것이 권장되지 않습니다).

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

여기 그것을 하는 다른 방법이 있습니다 :)

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

echo "현재 분기에 대한 마지막 commit id# 인쇄:"

 git reflog

실제 결과를 표시하는 이미지

나는 가장 최근의 약속을 원했습니다.origin/main내가 사용하는 브랜치

git ls-remote origin | grep main$ | cut -f 1

언급URL : https://stackoverflow.com/questions/949314/how-do-i-get-the-hash-for-the-current-commit-in-git

반응형