如何在Git中检索当前提交的哈希值?

时间:2009-06-04 08:42:51

标签: git tfs tfs-workitem changeset

我想保留(目前)将Git变更集链接到存储在TFS中的工作项的功能。

我已经编写了一个工具(使用Git中的一个钩子),我可以在其中将workitemidentifiers注入到Git变更集的消息中。

但是,我还想将Git提交的标识符(哈希)存储到自定义TFS工作项字段中。通过这种方式,我可以检查TFS中的工作项,并查看Git变更集与工作项的关联。

如何从Git的当前提交中轻松检索哈希?

21 个答案:

答案 0 :(得分:2427)

要将任意扩展对象引用转换为SHA-1,只需使用 git-rev-parse ,例如

git rev-parse HEAD

git rev-parse --verify HEAD

旁注: 如果您要转换参考分支标记 )进入SHA-1,有git show-refgit for-each-ref

答案 1 :(得分:375)

如果您只想要缩短的哈希值:

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

此外,使用%H是另一种获取长哈希的方法。

答案 2 :(得分:127)

另一个,使用git log:

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

它与@outofculture非常相似,虽然有点短。

答案 3 :(得分:85)

获得完整的SHA:

$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

获得缩短版本:

$ git rev-parse --short HEAD
cbf1b9a

答案 4 :(得分:65)

为了完整,因为还没有人建议它。 .git/refs/heads/master是一个只包含一行的文件:master上最新提交的哈希值。所以你可以从那里阅读它。

或者,如命令:

cat .git/refs/heads/master

更新

请注意,git现在支持在pack-ref文件中存储一些头部引用,而不是在/ refs / heads /文件夹中存储文件。 https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html

答案 5 :(得分:43)

总是git describe。默认情况下,它会为您提供 -

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

答案 6 :(得分:35)

提交哈希

git show -s --format=%H

缩写提交哈希

git show -s --format=%h

点击here了解更多git show个例子。

答案 7 :(得分:27)

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

答案 8 :(得分:20)

如果您需要在脚本期间将哈希值存储在变量中,则可以使用

last_commit=$(git rev-parse HEAD)

或者,如果你只想要前10个字符(比如github.com那样)

last_commit=$(git rev-parse HEAD | cut -c1-10) 

答案 9 :(得分:14)

我所知道的最简洁的方式:

git show --pretty=%h 

如果您想要添加的哈希值的特定位数:

--abbrev=n

答案 10 :(得分:12)

也许你想要一个别名,所以你不必记住所有漂亮的细节。完成以下步骤之一后,您只需输入:

即可
$ git lastcommit
49c03fc679ab11534e1b4b35687b1225c365c630

跟进accepted answer,以下是两种设置方法:

1)通过编辑全局配置(我的原始答案)来教授git显式方式:

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

2)或者如果你喜欢快捷方式来教git快捷方式,最近由Adrien评论过:

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

从此处开始,使用git lastcommit显示最后一次提交的哈希值。

答案 11 :(得分:11)

如果你想要超级黑客的方式:

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

基本上,git以。{1}}的形式将HEAD的位置存储在.git / HEAD中。这个命令读出来,切掉" ref:",并读出它指向的任何文件。

当然,这将在超级头模式下失败,因为HEAD不会" ref:...",但哈希本身 - 但你知道,我不是&# 39;你认为你期望在你的bash one-liners中有多少聪明才智。如果你不认为分号是在作弊,那么......

ref: {path from .git}

答案 12 :(得分:8)

我需要更多不同的东西:显示提交的完整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

答案 13 :(得分:6)

git show-ref --head --hash head

如果你正在追求速度,the approach mentioned by Deestan

cat .git/refs/heads/<branch-name>
到目前为止,

明显快于此处列出的任何其他方法。

答案 14 :(得分:5)

这是使用直接从git文件读取的Bash shell中的一行代码:

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

您需要在git根文件夹中运行以上命令。

当您拥有存储库文件但未安装git命令时,此方法非常有用。

如果不起作用,请检查.git/refs/heads文件夹中您有哪种头像。

答案 15 :(得分:2)

在home-dir文件“.gitconfig”中添加以下内容

[alias]
sha = rev-parse HEAD

然后你会有一个更容易记住的命令:

$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600

答案 16 :(得分:1)

以下是另一种方法:)

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

答案 17 :(得分:0)

这是另一个直接访问实现:

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

答案 18 :(得分:0)

cat .git/HEAD

注意:其输出为“。”。符号结尾。

答案 19 :(得分:0)

在git bash上,只需运行 $ git log -1

您将在命令后看到这些行。

commit d25c95d88a5e8b7e15ba6c925a1631a5357095db .. (info about your head)

d25c95d88a5e8b7e15ba6c925a1631a5357095db, is your SHA for last commit.

答案 20 :(得分:-3)

以下是使用提交哈希对我有用的步骤:

  1. 登录到您的GIT HUB链接,例如:https://github.<xyz.abc>.com
  2. 登录后,在“搜索或跳转到...”文本框中输入:

    hash:<GIT COMMIT HASH>
    
  3. 根据需要在“所有GitHub企业”或“在此组织中”之间进行选择

  4. 按Enter。