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

问:

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

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

我还想将 Git 提交的哈希存储在自定义 TFS 工作项字段中。通过这种方式,我可以检查 TFS 中的工作项并查看哪些 Git 变更集与该工作项相关联。

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

答1:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

要将任意扩展对象引用转换为 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。

--verify 意味着:The parameter given must be usable as a single, valid object name. Otherwise barf and abort.

git rev-parse --short HEAD 返回哈希的简短版本,以防万一有人想知道。

除了 Thane 所说,您还可以将特定长度添加到 --short,例如 --short=12,以从哈希中获取特定数量的数字。

@TysonPhalp:--short=N 大约是 最小 位数;如果缩短的数字与缩短的其他提交无法区分,则 git 使用更多的数字。尝试例如 git rev-parse --short=2 HEAD 或 git log --oneline --abbrev=2。

除了 Thane、Tyson 和 Jakub 所说的之外,您可以打印完整的哈希,但突出显示用 git rev-parse HEAD | GREP_COLORS='ms=34;1' grep $(git rev-parse --short=0 HEAD) 标识提交蓝色所需的十六进制

答2:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

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

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

此外,使用 %H 是获取长提交哈希的另一种方法,只需使用 -1 代替 -n 1。

或者,似乎在上面的 rev-parse 命令中添加 --short 似乎有效。

我认为 git log 是瓷器,而 git rev-parse 是管道。

这是一种不好/不正确的做法,因为如果你有一个分离的头,这种方法会给你错误的哈希值。例如,如果当前提交是 12ab34... 而之前的提交是 33aa44... 那么如果我执行 'git checkout 33aa44' 然后运行您的命令,我仍然会返回 12ab34... 尽管我的头实际上指向到 33aa44...

@theQuestionMan 我没有遇到您描述的行为; git checkout 33aa44; git log -n 1 给了我33aa44。你用的是什么版本的git?

@AmedeeVanGasse,啊!我不知道这是一个厕所的比喻!多年来,我一直在 git man 页中看到 porcelain,但不知道它指的是厕所!瓷器是马桶,它比水管“更接近使用者”(形象地坐在这个马桶上),而水管是较低级别的,距离使用者更远——即:在“瓷器”之下!脑洞大开。

答3:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

另一个,使用 git log:

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

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

结果不是单引号。

这是正确的答案,因为即使您签出特定提交而不是 HEAD,它也可以工作。

@Parsa:签出特定提交时,HEAD 指向此提交,而不是称为 detached head 的命名分支。

从命令行,避免寻呼机:git --no-pager log -1 --format="%H"

@Parsa您的(错误地赞成?)评论具有误导性,因为 jakub-narębski 'git rev-parse HEAD' 的公认答案在检查其他地方后有效。

答4:

huntsbot.com – 高效赚钱,自由工作

要获得完整的 SHA:

$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

要获得缩短版本:

$ git rev-parse --short HEAD
cbf1b9a

如果需要两个 git commit 哈希,例如一个来自您当前使用的 branch 和一个 master branch,如果您需要 master 的哈希,您也可以使用 git rev-parse FETCH_HEAD } commit 您merge加入当前的 branch。例如,如果您有给定 repo 的 branches master 和 feature/new-feature。而在 feature/new-feature 上,如果您需要 master 中的 commit 哈希,您可以使用 git fetch origin master && git merge FETCH_HEAD 然后 git rev-parse --short FETCH_HEAD您只需merge输入您可能拥有的任何脚本。

答5:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

提交哈希

git show -s --format=%H

缩写提交哈希

git show -s --format=%h

-s 标志与 --no-patch 相同,代表“抑制差异输出”。

点击 here 查看更多 git show 示例。

答6:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

为了完整起见,因为还没有人建议过。 .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

这假设当前分支是 master,这不一定是真的。

的确。这就是为什么我明确表示这是针对 master。

.git/HEAD 通常指向一个 ref,如果你有一个 SHA1,你就处于分离头模式。

与其他方法相比,这不是很健壮,特别是因为它假设有一个 .git 子目录,但不一定是这种情况。请参阅 git init 手册页中的 --separate-git-dir 标志。

+1 因为有时你不想安装 git 可执行文件(例如在你的 Dockerfile 中)

答7:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

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

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

Git describe 返回从提交中可到达的第一个 TAG。这如何帮助我获得 SHA?

我喜欢 git describe --long --dirty --abbrev=10 --tags 它会给我类似 7.2.0.Final-447-g65bf4ef2d4 的东西,它是 7.2.0.Final 标记之后的 447 次提交,当前 HEAD 处全局 SHA-1 的前 10 个摘要是“65bf4ef2d4”。这对于版本字符串非常有用。使用 --long 它总是会添加计数(-0-)和哈希,即使标签恰好匹配。

如果不存在标签,则 git describe --always 将“将唯一缩写的提交对象显示为后备”

我使用 git describe --tags --first-parent --abbrev=11 --long --dirty --always。 --always 选项意味着即使没有标签,它也会提供结果(散列)。 --first-parent 表示它不会被合并提交弄糊涂,只会跟随当前分支上的项目。另请注意,如果当前分支有未提交的更改,--dirty 会将 -dirty 附加到结果中。

答8:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

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

git-rev-list 是关于生成提交对象列表;将对象名称(例如 HEAD)转换为 SHA-1 是 git-rev-parse

答9:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

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

last_commit=$(git rev-parse HEAD);

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

last_commit=$(git rev-parse --short=10 HEAD);

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

答10:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

如果你想要超级hacky的方式来做到这一点:

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

基本上,git 以 ref: {path from .git} 的形式将 HEAD 的位置存储在 .git/HEAD 中。该命令将其读出,切掉“ref:”,并读出它指向的任何文件。

当然,这在分离头模式下会失败,因为 HEAD 不会是“ref:…”,而是哈希本身 - 但你知道,我认为你不希望你的 bash 有这么多聪明-衬里。但是,如果您不认为分号作弊…

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

不需要安装git,我喜欢。 (我的 docker build 镜像没有 git)

也很有用,因为您可以从 git repo 外部轻松运行它

我将其形式化为本地机器的脚本。然后,我想,嘿:我所做的实现足够简单,它说明了如何解决一个不相关的问题(在没有外部程序的情况下解析原始 POSIX shell 脚本中的参数),但足够复杂,可以提供一些变化并利用大多数sh 的特征。半小时后的文档评论,这里是它的要点:gist.github.com/Fordi/29b8d6d1ef1662b306bfc2bd99151b07

看着它,我做了一个更广泛的版本来检测 Git 和 SVN,并抓取 git hash/svn 修订版。这次不是一个干净的字符串,但很容易被命令行解析,并可用作版本标记:gist.github.com/Fordi/8f1828efd820181f24302b292670b14e

答11:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

我需要一些不同的东西:显示提交的完整 sha1,但如果工作目录不干净,则在末尾附加一个星号。除非我想使用多个命令,否则前面的答案中的选项都不起作用。

这是一个可以做到的班轮: git describe --always --abbrev=0 --match “NOT A TAG” --dirty="" 结果:f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe

说明:描述(使用带注释的标签)当前提交,但仅使用包含“NOT A TAG”的标签。由于标签不能有空格,因此它永远不会匹配标签,并且由于我们想要显示结果 --always,因此该命令回退显示提交的完整 (–abbrev=0) sha1,如果工作目录是 { 3}。

如果您不想附加星号,这与前面答案中的所有其他命令一样工作: git describe --always --abbrev=0 --match “NOT A TAG” 结果:f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe

谢谢,只是绊倒它,它让我免于为此而产生一个或其他的回声:)

没有 --match "NOT A TAG" 它对我有用。在 git 2.18.0 和 2.7.4 中测试。有没有需要这个论点的情况?

@Thomas 如果您在当前提交的历史记录中的任何地方都有带注释的标签,它将不起作用。 fake 标签确保 describe 命令不使用标签来描述提交,

原文链接:https://www.huntsbot.com/qa/bL8X/how-to-retrieve-the-hash-for-the-current-commit-in-git?lang=zh_CN&from=csdn

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值