我想保留(目前)将Git变更集链接到存储在TFS中的工作项的功能。
我已经编写了一个工具(使用Git中的一个钩子),我可以在其中将workitemidentifiers注入到Git变更集的消息中。
但是,我还想将Git提交的标识符(哈希)存储到自定义TFS工作项字段中。通过这种方式,我可以检查TFS中的工作项,并查看Git变更集与工作项的关联。
如何从Git的当前提交中轻松检索哈希?
答案 0 :(得分:2427)
要将任意扩展对象引用转换为SHA-1,只需使用 git-rev-parse ,例如
git rev-parse HEAD
或
git rev-parse --verify HEAD
旁注: 如果您要转换参考(分支和标记 )进入SHA-1,有git show-ref
和git 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)
答案 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)
以下是使用提交哈希对我有用的步骤:
https://github.<xyz.abc>.com
登录后,在“搜索或跳转到...”文本框中输入:
hash:<GIT COMMIT HASH>
根据需要在“所有GitHub企业”或“在此组织中”之间进行选择