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

How to retrieve the hash for the current commit in Git?

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

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

但是,我还希望将git commit(散列)的标识符存储到自定义tfs工作项字段中。通过这种方式,我可以检查TFS中的工作项,并查看哪些Git变更集与该工作项关联。

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


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

1
git rev-parse HEAD

1
git rev-parse --verify HEAD

旁注:如果要将引用(分支和标记)转换为sha-1,则有git show-refgit for-each-ref


如果只需要缩短的哈希:

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

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


另一个,使用git日志:

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

它与@outofculture非常相似,不过有点短。


要获得完整的sha:

1
2
$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

要获得缩短的版本:

1
2
$ git rev-parse --short HEAD
cbf1b9a


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

或者,作为命令:

1
cat .git/refs/heads/master

更新:

注意,Git现在支持在pack-ref文件中存储一些head-refs,而不是作为/refs/heads/文件夹中的文件。https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html网站


也总是有git describe。默认情况下它会给你--

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


提交哈希

1
git show -s --format=%H

缩写的提交哈希

1
git show -s --format=%H

单击此处查看更多git show示例。


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


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

1
last_commit=$(git rev-parse HEAD)

或者,如果只需要前10个字符(如github.com)

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


我知道的最简洁的方法是:

1
git show --pretty=%h

如果需要哈希的特定位数,可以添加:

1
--abbrev=n


也许你需要一个别名,这样你就不必记住所有漂亮的细节。完成以下步骤之一后,您将能够简单地键入:

1
2
$ git lastcommit
49c03fc679ab11534e1b4b35687b1225c365c630

跟进已接受的答案,有两种设置方法:

1)通过编辑全局配置(我的原始答案),教Git明确的方法:

1
2
3
4
5
6
7
 # open the git config editor
 $ git config --global --edit
 # in the alias section, add
 ...
 [alias]
   lastcommit = rev-parse HEAD
 ...

2)或者如果你喜欢教Git一个捷径,就像最近Adrien评论的那样:

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

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


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

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

基本上,git以.git/head的形式存储head的位置,格式为ref: {path from .git}。这个命令读取这些信息,切掉"ref:",并读取它指向的任何文件。

当然,这在分离头模式下会失败,因为head不是"ref:…",而是散列本身-但是你知道,我认为你不希望在bash-one中有那么多的聪明。如果你不认为分号作弊,尽管…

1
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*

说明:描述(使用带注释的标记)当前提交,但只使用包含"not a tag"的标记。由于标记不能有空格,所以这永远不匹配标记,而且由于我们想要显示结果--always,所以命令会返回显示commit的完整(--abbrev=0sha1,如果工作目录是--dirty则会附加一个星号。

如果不想附加星号,这与前面答案中的所有其他命令一样工作:埃多克斯1〔5〕结果:f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe


1
git show-ref --head --hash head

如果你想加快速度,迪斯坦提到的方法

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

比这里列出的任何其他方法都快得多。


下面是bash shell中使用从git文件直接读取的一个行程序:

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

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

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

如果不起作用,请查看.git/refs/heads文件夹,您有什么样的头。


在home dir in file".gitconfig"中添加以下内容

1
2
[alias]
sha = rev-parse HEAD

然后您将有一个更容易记住的命令:

1
2
$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600


以下是另一种方法:)

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


下面是另一个直接访问实现:

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

这也适用于HTTP,它对本地包存档很有用(我知道:对于公共网站,建议不要使.git目录可访问):

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


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

  • 登录您的Git Hub链接,例如:https://github..com
  • 登录后,在"搜索或跳转到…"文本框中输入为:

    1
    hash:<GIT COMMIT HASH>
  • 根据您的需要,在"所有Github企业"或"在此组织中"之间进行选择

  • 按Enter键。