2016-02-29 112 views
2

我正在使用git describe作为构建时在我的应用程序中进行版本控制的驱动程序。 大致是它的样子:git describe --always --dirty --match version*如何合理地将“git describe --match”与浅层克隆结合使用?

标记我的版本,像version.1.2.3模式,并构建出数字基于什么关最后一次提交的应用程序的版本被标记的东西,如version.*了。 如果我没有标记给定的提交,那么版本号码最后会出现类似version.1.14.3-24-ged66bf5的内容,它基于最近的标记,自该标记以来提交了多少次提交以及git commit id。

这对我个人而言确实很好,但是我在CI服务器上建立一个浅层克隆时遇到问题。当我在我的git build上使用“浅克隆”选项时(我猜这只是在执行“--depth = 1”),我的“git describe”命令不再按照我希望的那样执行做。 我的版本号最后只是提交ID - 我猜这是因为在浅克隆中没有标签版本,因此describe命令的--always参数只是最终将提交ID吐出。

我可以通过不做浅层克隆来解决这个问题。

但我真的很喜欢把我的版本从git描述中解放出来 - 即使对浅层克隆我怎么能继续使用它呢? 我认为我需要做的是在浅层克隆时指定深度为“从分支尖端回到具有匹配version.*的标签的最新版本”。

这是我能用Git做的事吗?

+0

你有没有想过建立一个'混帐alias'是做到了这一点呢?我绝不是在创建复杂的人的专家,但我知道,你可以得到相当疯狂的工作流程来实现,通过使用它们。 或者使用侦听您的部署分支('post-commit-hook')的git钩子,并做几乎相同的事情。 –

+1

@JensHöpken这个git别名是什么样的? – Shorn

回答

2

您不能:浅层克隆缺少标记对象并提交它们标记。

更确切地说,这取决于该克隆的深度以及历史上必须走多远才能找到合适的标签。例如,使用--depth 1000进行浅度克隆就足够了。确切的数字取决于您在关注的标签之间提交的提交数量,其范围为。

你是正确的,如果混帐提供了“深化直到标记”,即会做的伎俩,但Git不会,更糟的是,深化浅克隆并不会自动带来了标签。 (可能会编写一个脚本,使用git ls-remotegit fetch --depth继续加深克隆,直到出现一些标记的提交,然后让脚本手动应用这些标记,因为它可能只会采用这种方法。 Python或shell代码的几十行,例如,这取决于你如何稳健想这样做。但它不包括在GIT本身)。


的“之间”的概念是一个有点玄乎在一个非线性图中,但我想这里的总体思路应该足够清楚。