首页 文章

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

提问于
浏览
1504

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

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

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

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

18 回答

  • 69

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

    last_commit=$(git rev-parse HEAD)
    

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

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

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

    git show --pretty=%h
    

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

    --abbrev=n
    
  • 11

    要将任意扩展对象引用转换为SHA-1,请简单地使用 git-rev-parse

    git rev-parse HEAD
    

    要么

    git rev-parse --verify HEAD
    

    Sidenote: 如果要将引用( branchestags )转换为SHA-1,则有 git show-refgit for-each-ref .

  • 5

    如果您只想要缩短哈希:

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

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

  • 25

    另一个,使用git日志:

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

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

  • 13

    要获得完整的SHA:

    $ git rev-parse HEAD
    cbf1b9a1be984a9f61b79a05f23b19f66d533537
    

    要获得缩短版本:

    $ git rev-parse --short HEAD
    cbf1b9a
    
  • 6

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

  • 0

    总有 git describe . 默认情况下它会给你 -

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

    提交哈希

    git show -s --format=%H
    

    缩写提交哈希

    git show -s --format=%h
    

    单击here以获取更多 git show 示例 .

  • 351

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

  • 38

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

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

  • 2

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

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

    基本上,git以.128251_的形式将HEAD的位置存储在.git / HEAD中 . 此命令将其读出,切掉"ref: ",并读出它指向的任何文件 .

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

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

    我需要更多不同的东西:显示提交的完整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

  • 5
    git show-ref --head --hash head
    

    如果你想要速度,the approach mentioned by Deestan

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

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

  • 119

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

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

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

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

    如果不起作用,请检查 .git/refs/heads 文件夹中有哪种头像 .

  • 2216

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

    [alias]
    sha = rev-parse HEAD
    

    然后你会有一个更简单的命令记得:

    $ git sha
    59fbfdbadb43ad0b6154c982c997041e9e53b600
    
  • 63

    这是用另一种方式做到:)

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

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

    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
    

相关问题