질문자 :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-ref
및 git 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 Tyreegit 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
을 사용하여 마지막 커밋의 해시를 표시합니다.
miraculixxgit 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.
Battygit 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