我想保留(现在)能够将Git变更集链接到存储在TFS中的工作项 .
我已经编写了一个工具(使用Git中的一个钩子),我可以在其中将workitemidentifiers注入到Git变更集的消息中 .
但是,我还想将Git提交的标识符(哈希)存储到自定义TFS工作项字段中 . 通过这种方式,我可以检查TFS中的工作项,并查看与工作项相关联的Git更改集 .
如何从Git的当前提交中轻松检索哈希?
如果需要在脚本期间将哈希存储在变量中,则可以使用
last_commit=$(git rev-parse HEAD)
或者,如果你只想要前10个字符(比如github.com)
last_commit=$(git rev-parse HEAD | cut -c1-10)
我所知道的最简洁的方式:
git show --pretty=%h
如果您想要添加散列的特定位数,可以添加:
--abbrev=n
要将任意扩展对象引用转换为SHA-1,请简单地使用 git-rev-parse
git rev-parse HEAD
要么
git rev-parse --verify HEAD
Sidenote: 如果要将引用( branches 和 tags )转换为SHA-1,则有 git show-ref 和 git for-each-ref .
git show-ref
git for-each-ref
如果您只想要缩短哈希:
git log --pretty=format:'%h' -n 1
此外,使用%H是获得长哈希的另一种方法 .
另一个,使用git日志:
git log -1 --format="%H"
它与@outofculture非常相似,虽然有点短 .
要获得完整的SHA:
$ git rev-parse HEAD cbf1b9a1be984a9f61b79a05f23b19f66d533537
要获得缩短版本:
$ git rev-parse --short HEAD cbf1b9a
为了完整起见,因为还没有人建议它 . .git/refs/heads/master 是一个只包含一行的文件: master 上最新提交的哈希值 . 所以你可以从那里读它 .
.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 describe . 默认情况下它会给你 -
git describe
john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe --always release-0.19-11-g7a68a75
提交哈希
git show -s --format=%H
缩写提交哈希
git show -s --format=%h
单击here以获取更多 git show 示例 .
git show
使用 git rev-list --max-count=1 HEAD
git rev-list --max-count=1 HEAD
也许你想要一个别名,所以你不必记住所有漂亮的细节 . 完成以下步骤之一后,您只需键入:
$ 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 显示最后一次提交的哈希值 .
git lastcommit
如果你想要超级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
我需要更多不同的东西:显示提交的完整sha1,但如果工作目录不干净,则在末尾添加星号 . 除非我想使用多个命令,否则之前答案中的所有选项都不起作用 .
这是一个做衬垫:git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"结果: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*
说明:描述(使用带注释的标记)当前提交,但仅包含包含"NOT A TAG"的标记 . 由于标签不能包含空格,因此它永远不会匹配标签,因为我们要显示结果 --always ,该命令会显示提交的完整( --abbrev=0 )sha1,如果工作目录为 --dirty ,则会附加星号 .
--always
--abbrev=0
--dirty
如果您不想附加星号,这与前面答案中的所有其他命令一样:git describe --always --abbrev=0 --match "NOT A TAG"结果: f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe
git describe --always --abbrev=0 --match "NOT A TAG"
f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe
git show-ref --head --hash head
如果你想要速度,the approach mentioned by Deestan
cat .git/refs/heads/<branch-name>
比目前为止列出的任何其他方法快得多 .
这是Bash shell中的单行使用直接从git文件读取:
(head=($(<.git/HEAD)); cat .git/${head[1]})
您需要在git根文件夹中运行以上命令 .
当您拥有存储库文件时,此方法非常有用,但尚未安装 git 命令 .
git
如果不起作用,请检查 .git/refs/heads 文件夹中有哪种头像 .
.git/refs/heads
在您的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,这对本地包档案很有用(我知道:对于公共网站,不建议使.git目录可访问):
head="$(curl -s "$baseurl/.git/HEAD")" while [ "$head" != "${head#ref: }" ]; do head="$(curl -s "$baseurl/.git/${head#ref: }")" done
18 回答
如果需要在脚本期间将哈希存储在变量中,则可以使用
或者,如果你只想要前10个字符(比如github.com)
我所知道的最简洁的方式:
如果您想要添加散列的特定位数,可以添加:
要将任意扩展对象引用转换为SHA-1,请简单地使用 git-rev-parse
要么
Sidenote: 如果要将引用( branches 和 tags )转换为SHA-1,则有
git show-ref
和git for-each-ref
.如果您只想要缩短哈希:
此外,使用%H是获得长哈希的另一种方法 .
另一个,使用git日志:
它与@outofculture非常相似,虽然有点短 .
要获得完整的SHA:
要获得缩短版本:
为了完整起见,因为还没有人建议它 .
.git/refs/heads/master
是一个只包含一行的文件:master
上最新提交的哈希值 . 所以你可以从那里读它 .或者,如命令:
更新:
请注意,git现在支持在pack-ref文件中存储一些头部引用,而不是在/ refs / heads /文件夹中存储文件 . https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html
总有
git describe
. 默认情况下它会给你 -提交哈希
缩写提交哈希
单击here以获取更多
git show
示例 .使用
git rev-list --max-count=1 HEAD
也许你想要一个别名,所以你不必记住所有漂亮的细节 . 完成以下步骤之一后,您只需键入:
关注accepted answer,以下是两种设置方法:
1)通过编辑全局配置(我的原始答案)来教授git显式方式:
2)或者如果你喜欢快捷方式来教git快捷方式,最近由Adrien评论:
从此处开始,使用
git lastcommit
显示最后一次提交的哈希值 .如果你想要超级hacky方式来做到这一点:
基本上,git以.128251_的形式将HEAD的位置存储在.git / HEAD中 . 此命令将其读出,切掉"ref: ",并读出它指向的任何文件 .
当然,这在分离头模式下会失败,因为HEAD不会是“ref:...”,而是哈希本身 - 但是你知道,我认为你不希望你的bash中有那么多聪明人-liners . 如果你不认为分号是作弊,但......
我需要更多不同的东西:显示提交的完整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
如果你想要速度,the approach mentioned by Deestan
比目前为止列出的任何其他方法快得多 .
这是Bash shell中的单行使用直接从git文件读取:
您需要在git根文件夹中运行以上命令 .
当您拥有存储库文件时,此方法非常有用,但尚未安装
git
命令 .如果不起作用,请检查
.git/refs/heads
文件夹中有哪种头像 .在您的home-dir文件“.gitconfig”中添加以下内容
然后你会有一个更简单的命令记得:
这是用另一种方式做到:)
这是另一个直接访问实现:
这也适用于http,这对本地包档案很有用(我知道:对于公共网站,不建议使.git目录可访问):