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

Sardaukar 1788 git tfs changeset tfs-workitem

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

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

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

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

Jakub Narębs.. 2621

要打开任意扩展对象引用到SHA-1中,使用简单的git-REV-解析,例如

git rev-parse HEAD

要么

git rev-parse --verify HEAD

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

  • `git rev-parse --short HEAD`返回哈希的简短版本,以防有人想知道. (608认同)
  • `--verify`意味着:`给定的参数必须可用作单个有效的对象名.否则barf和abort (74认同)
  • 除了Thane所说的,您还可以为`--short`添加特定长度,例如`--short = 12`,以从散列中获取特定数量的数字. (50认同)
  • 除了Thane,Tyson和Jakub所说的,你可以打印完整的哈希,但突出显示使用`git rev-parse HEAD |识别提交蓝色所需的六角形.GREP_COLORS ='ms = 34; 1'grep $(git rev-parse --short = 0 HEAD) (33认同)
  • @TysonPhalp:`--short = N`约为**最小**位数; 如果缩短的数字将与缩短的其他提交无法区分,则git使用更多的数字.试试例如`git rev-parse --short = 2 HEAD`或`git log --oneline --abbrev = 2`. (29认同)
  • @Zaz这对我来说也不起作用,但只是`git rev-parse HEAD | grep --color $(git rev-parse --short = 0 HEAD)`的确如此. (7认同)
  • 除了@ThaneBrimhall所说的,你可以使用`git rev-parse ca003ae`从短版本的哈希中获得完整的SHA-1引用. (4认同)

outofculture.. 404

如果您只想要缩短哈希:

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

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

  • 或者,似乎在上面的rev-parse命令中添加--short似乎可行. (101认同)
  • 我认为`git log`是瓷器,`git rev-parse`是管道. (12认同)
  • 这是一种不好/不正确的方法,因为如果你有一个分离的头,这个方法会给你错误的哈希.例如,如果当前提交是12ab34 ...并且之前的提交是33aa44 ...那么如果我做'git checkout 33aa44'然后我运行你的命令我仍然会回到12ab34 ...尽管我的头实际指向到33aa44 ...... (4认同)
  • @theQuestionMan我没有遇到您描述的行为;`git checkout 33aa44; git log -n 1`给我`33aa44`。您正在使用什么版本的git? (2认同)

Paul Pladijs.. 143

另一个,使用git日志:

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

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

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

Alexander.. 105

要获得完整的SHA:

$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

要获得缩短版本:

$ git rev-parse --short HEAD
cbf1b9a


Deestan.. 67

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

  • `.git/HEAD`通常指向一个ref,如果你有一个SHA1,你处于分离头模式. (19认同)
  • +1因为有时你不想安装git可执行文件(例如在你的Dockerfile中) (15认同)
  • 确实.这就是为什么我明确地说这是为了'master`. (12认同)
  • 假设当前分支是"master",这不一定是真的. (8认同)
  • 与其他方法相比,这并不是非常强大,特别是因为它假定存在一个`.git`子目录,但不一定是这种情况.请参阅`git init`手册页中的`--separate-git-dir`标志. (6认同)
  • 用于查找分支`.git/refs/heads/<branch-name>`的SHA哈希 (3认同)

John Tyree.. 50

git describe有一点也好.默认情况下它会给你 -

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

  • 我喜欢`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-)和散列,即使标签恰好匹配. (40认同)
  • Git describe返回从提交可到达的第一个TAG.这有助于我获得SHA? (15认同)
  • 如果没有标签,则`git describe --always`将"显示唯一缩写的提交对象作为后备" (14认同)

ecwpz91.. 46

提交哈希

git show -s --format=%H

缩写提交哈希

git show -s --format=%h

点击此处查看更多git show示例.


Robert Munte.. 28

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

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

小智.. 20

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

last_commit=$(git rev-parse HEAD)

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

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

  • `git rev-parse`还有`--short`或`--short = number`参数; 不需要使用管道和"切割". (26认同)

Brian Peters.. 14

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

git show --pretty=%h 

如果您想要添加散列的特定位数,可以添加:

--abbrev=n

  • 虽然这在技术上有效,但是`git show`就是所谓的瓷器命令(即面向用户),因此*不应该在脚本中使用,因为它的输出可能会发生变化.应该使用上面的答案(`git rev-parse --short HEAD`). (14认同)
  • @ jm3那是倒退的."Porcelain"命令具有稳定的输出,用于脚本.搜索`git help show`为`瓷`. (4认同)
  • @JohnTyree这是一个令人困惑的主题,但是jm3是正确的:瓷器命令不是要被解析的,而是要易于理解的。如果您需要在脚本中使用瓷器命令并且希望使用稳定的格式,有时(例如使用git status,push和blame)有一个选项可以做到这一点。不幸的是,该选项称为“-瓷器”,这就是为什么这样令人困惑的原因。您可以在[VonC的这个很好的答案](/sf/ask/17360801/)中找到详细信息。 (2认同)

miraculixx.. 13

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

$ git lastcommit
49c03fc679ab11534e1b4b35687b1225c365c630

按照接受的答案,以下是两种设置方法:

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显示最后一个提交的哈希值.

  • [Adrien de Sentenac](http://stackoverflow.com/users/5573195)指出,不是手动编辑git配置文件,你可以简单地做:`git config --global alias.lastcommit"rev-parse HEAD"` (3认同)

Fordi.. 12

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

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

基本上,git将HEAD的位置存储在表单中的.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


Rado.. 9

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

这是一个做过的班轮:
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
结果:f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*

说明:描述(使用带注释的标签)当前提交,但仅包含包含"NOT A TAG"的标签.由于标签不能包含空格,因此它永远不会匹配标签,因为我们要显示结果--always,所以命令会回退显示--abbrev=0提交的full()sha1,如果工作目录是,它会附加一个星号--dirty.

如果您不想附加星号,则其效果与之前答案中的所有其他命令相同:
git describe --always --abbrev=0 --match "NOT A TAG"
结果:f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe


Dennis.. 7

git show-ref --head --hash head

如果你想要速度,那么Deestan提到的方法

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

比目前为止列出的任何其他方法快得多.


kenorb.. 6

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

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

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

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

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


归档时间:

查看次数:

810987 次

最近记录:

11 月 前