如何检索Git中当前提交的散列?

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

我已经写了一个工具(使用来自Git的钩子),我可以将workiteidentifiers注入Git变更集的消息中。

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

我怎么能轻松地从Git的当前提交中检索哈希?

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

git rev-parse HEAD 

要么

 git rev-parse --verify HEAD 

旁注:如果你想把引用分支标签 )转换成SHA-1,那么有git show-refgit for-each-ref

如果你只想要缩短的哈希:

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

此外,使用%H是获得长散列的另一种方法。

另外一个,使用git log:

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

虽然有点短,但和@outofculture非常相似。

为了完整,因为没有人提出它。 .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

要获得完整的SHA:

 $ git rev-parse HEAD cbf1b9a1be984a9f61b79a05f23b19f66d533537 

要获得缩短的版本:

 $ git rev-parse --short HEAD cbf1b9a 

总是有git describe 。 默认情况下,它给你 –

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

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

如果您需要在脚本中将散列存储在variables中,则可以使用

 last_commit=$(git rev-parse HEAD) 

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

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

提交哈希

 git show -s --format=%H 

缩写提交哈希

 git show -s --format=%h 

点击这里查看更多的git show示例。

我知道最简洁的方式:

 git show --pretty=%h 

如果你想要一个特定数量的哈希数字,你可以添加:

 --abbrev=n 

如果你想用超级哈克的方式来做到这一点:

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

基本上,git将头部的位置存储在.git / HEAD中,格式为ref: {path from .git} 。 这个命令读出来,切掉“ref:”,并读出它指向的任何文件。

当然,这将会以分离头模式失败,因为HEAD不会是“ref:…”,而是哈希本身 – 但是你知道,我不认为你期望在你的bash中有太多的智慧-liners。 如果你不认为分号是作弊,虽然…

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

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

 $ git lastcommit 49c03fc679ab11534e1b4b35687b1225c365c630 

继续接受的答案 ,这里有两种方法来设置:

1)通过编辑全局configuration(我原来的答案)教学显式的方法:

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

2)或者,如果你喜欢一个捷径教捷克捷径,最近评论阿德里安:

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

从这里开始,使用git lastcommit来显示最后一个提交的散列。

 git show-ref --head --hash head 

如果你追求速度, Deestan提到的方法

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

比迄今为止列出的其他方法快得多。

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

 [alias] sha = rev-parse HEAD 

那么你将有一个更简单的命令来记住:

 $ git sha 59fbfdbadb43ad0b6154c982c997041e9e53b600 

这是另一种方式:)

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

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

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

这也适用于http,这对本地软件包档案很有用(我知道:对于公共网站,不build议使.git目录可访问):

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

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

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

你需要在你的git根文件夹中运行上面的命令。

当你有仓库文件时,这个方法会很有用,但是git命令没有安装。