使用Git描述没有标签

时间:2017-07-05 16:23:44

标签: git

我有一个存储库,当我运行git describe时,它只给我一个哈希值。直到今天我才知道它是由于--always选项(我正在使用的)而执行此操作,因为该存储库没有标记。我有另一个包含大量标签的存储库。

如何使用git describe排除标记,只是给我一个哈希?我想拥有git describe的所有其他功能,以防我需要使用其他功能,例如脏标记;我只想排除标签。这是可能的,还是标记describe的核心功能?

帮助页面似乎表明了这一点,但我只是想确定一下。我在Ant build.xml文件中使用它,所以我试图保持这个简单。

3 个答案:

答案 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 55f6bcecommit 6271d94commit c263279Frederick Eaton (``)(2018年9月19日)。
(由Junio C Hamano -- gitster --commit fb468f0中合并,2018年10月16日)

  

git-describe.1:说明“人类可读”也是git可读

     

标题使用“人类可读”一词,但“ DESCRIPTION”确实   在上下文中不做解释。

man page现在包括:

  

结果是一个“人类可读的”对象名称,该名称也可以用于标识对其他git命令的提交。