我有一个存储库,当我运行git describe
时,它只给我一个哈希值。直到今天我才知道它是由于--always
选项(我正在使用的)而执行此操作,因为该存储库没有标记。我有另一个包含大量标签的存储库。
如何使用git describe
排除标记,只是给我一个哈希?我想拥有git describe
的所有其他功能,以防我需要使用其他功能,例如脏标记;我只想排除标签。这是可能的,还是标记describe
的核心功能?
帮助页面似乎表明了这一点,但我只是想确定一下。我在Ant build.xml文件中使用它,所以我试图保持这个简单。
答案 0 :(得分:6)
是的,但这不一定是个好主意。 是一个--all
选项,它会搜索分支名称 - 或者实际上是所有引用 - 但是如果你使用它,你可能还需要--long
。
git describe
输出的核心特征是它以一个人类可读的(或应该是)人名可读的名称开头:
v1.2.3
对此,如果需要,Git将添加一个后缀,指示当前(或请求的)提交不是完全由此字符串命名的提交。后缀告诉你和Git偏离标签多少钱。如果有 no 后缀,则标记本身将提交命名。由于标签永远不会 1 移动,如果我们有这个名称,我们保证 2 使用该名称找到正确的提交。
使用没有标记且没有--always
的存储库:
$ git describe
fatal: No names found, cannot describe anything.
但是,如果我们添加--all
,我们可能会这样:
$ git describe --all
heads/master
这个 是一个人类可读的名称,但它有一个问题:它不能唯一地标识一个特定的提交,因为分支名称做移动。在此存储库中进行新提交后,refs/heads/master
现在命名不同的提交。
由于来自git describe
的其中一个输出的通常 intent 是提供一个人类可读但精确提交指定的ID,一个分支名称,这绝不是那么精确,不一定是好事。
你可以添加--long
:
$ git describe --long
heads/master-0-g2cbd83f
现在使用-g...
后缀指定实际哈希ID的前缀。现在Git可以验证master
本身没有移动,或者如果有,你可以使用2cbd83f
字符串来查找提交。
1 好吧,几乎没有。有关何时以及为何以及为何不移动标记,请参阅the git-tag
documentation。
2 无论如何,保证标签没有移动。
答案 1 :(得分:3)
执行此操作的一种简单方法是将--always
与-exclude
选项结合使用*
的glob模式,以排除所有标记。由于它不会找到任何未排除的标签,因此描述将回落到缩写的sha1加上可选的" -dirty"等等。
$ git describe --always --dirty --abbrev=5
2018.02-rc1-58-gca0e6
$ git describe --always --dirty --abbrev=5 --exclude '*'
ca0e6
答案 2 :(得分:0)
由于
git describe
的这些输出之一的通常意图是提供一个人类可读但确切指定提交的ID
根据Git 2.20,这是官方git describe --long
要做的事情
请参见commit 55f6bce的commit 6271d94,commit c263279,Frederick Eaton (``)(2018年9月19日)。
(由Junio C Hamano -- gitster
--在commit fb468f0中合并,2018年10月16日)
git-describe.1
:说明“人类可读”也是git可读标题使用“人类可读”一词,但“ DESCRIPTION”确实 在上下文中不做解释。
man page现在包括:
结果是一个“人类可读的”对象名称,该名称也可以用于标识对其他git命令的提交。