我git describe在构建时用作应用程序版本控制的驱动程序。它看起来大致如下:git describe --always --dirty --match version*
我用类似的模式标记我的版本,version.1.2.3构建根据最后一次用类似标记的提交来计算应用程序的版本version.*。如果我没有标记给定的提交,那么版本号最终会类似于version.1.14.3-24-ged66bf5,它基于最近的标签,自该标签以来的提交次数和 git commit id。
这对我个人来说非常有效,但是我在 CI 服务器上基于浅层克隆进行构建时遇到了问题。
在 jenkins 中的 git 构建中使用“浅克隆”选项时(我猜它只是在执行“--depth = 1”),我的git describe命令不再执行我想要它执行的操作。我的版本号最终只是提交 id - 我想这是因为浅克隆中没有标记版本,所以--alwaysdescribe 命令的参数最终只是吐出提交 id。
我暂时可以通过不进行浅层克隆来解决这个问题。
但我真的很喜欢从 git describe 驱动我的版本控制 - 即使使用浅克隆,我如何继续使用它?我认为我需要能够做的是在浅克隆时指定,我希望深度是“从分支的尖端回到具有标签匹配的最新版本version.*”。
这是我可以用 Git 做的事情吗?
您不能:浅克隆缺少标记对象并提交它们标记。
更准确地说,这取决于该克隆的深度以及一个人必须在历史上追溯多远才能找到合适的标签。例如,制作您的浅层克隆--depth 1000可能就足够了。确切的数字取决于您在1 个您关心的标签之间有多少提交。
你是对的,如果 git 提供了“深入直到标记”,那就可以解决问题,但 git 没有,更糟糕的是,加深浅克隆不会自动带来标签。
(可以编写一个使用git ls-remote并git fetch --depth继续深化克隆的脚本,直到出现一些标记的提交,然后让脚本手动应用标记,就像这样。这可能只需要几十行 Python或 shell 代码,例如,取决于您想要它的健壮程度。但它不包含在 git 本身中。)
1 “介于”的概念在非线性图中有点不确定,但我认为这里的总体思路应该足够清楚。