我有一个存储库,当我运行时只给我一个哈希git describe
.直到今天我都不知道它是否因为该--always
选项(我正在使用它)而执行此操作,因为该存储库没有标记.我有另一个包含大量标签的存储库.
我怎样才能git describe
用来排除标签,只给我一个哈希?我希望拥有所有其他功能,git describe
以防我需要使用其他功能,例如脏标记; 我只想排除标签.这是可能的,还是标签的核心特征describe
?
帮助页面似乎表明了这一点,但我只是想确定一下.我在Ant build.xml文件中使用它,所以我试图保持这个简单.
是的,但这不一定是个好主意.这里是一个--all
选项,它会搜索分支的名称,或事实上,所有引用,为好,但如果你使用,你可能还需要--long
.
git describe
输出的核心特征是它以一个(或应该是)人类可读的名称开头:
v1.2.3
对此,如果需要,Git将添加一个后缀,指示当前(或请求的)提交不完全是此字符串命名的提交.后缀告诉你和Git偏离标签多少钱.如果没有后缀,则标记本身命名提交.由于标签从来没有1的举动,如果我们有这个名字,我们都保证2寻找使用该名称的正确提交.
使用没有标签的存储库而不是--always
:
$ git describe fatal: No names found, cannot describe anything.
--all
但是,如果我们添加,我们可能会得到:
$ git describe --all heads/master
这是一个人类可读的名称,但它有一个问题:它不能唯一地标识一个特定的提交,因为分支名称确实移动.一旦我在这个存储库中进行了新的提交,refs/heads/master
现在命名一个不同的提交.
由于这些输出之一的通常意图git describe
是提供人类可读但精确提交指定的ID,因此分支名称从来不是那么精确,不一定是好事.
你可以添加--long
:
$ git describe --long heads/master-0-g2cbd83f
现在使用-g...
后缀来指定实际哈希ID的前缀.现在Git可以验证master
自己没有移动,或者如果有,你可以使用2cbd83f
字符串来查找提交.
1好吧,几乎没有.请参阅有关何时以及为何以及为何不移动标签的git-tag
文档.
2无论如何,保证标签没有移动.
一种简单的方法是--always
与该-exclude
选项结合使用glob模式*
,以排除所有标记。由于找不到任何不排除的标记,所以describe将回退到缩写的sha1加上可选的“ -dirty”等。
$ git describe --always --dirty --abbrev=5 2018.02-rc1-58-gca0e6 $ git describe --always --dirty --abbrev=5 --exclude '*' ca0e6