【问题标题】:How can I use "git describe --match" sensibly in combination with a shallow clone?如何将“git describe --match”与浅克隆结合使用?
【发布时间】:2016-02-29 04:21:08
【问题描述】:

我在构建时使用git describe 作为我的应用程序版本控制的驱动程序。 大致如下:git describe --always --dirty --match version*

我用version.1.2.3 之类的模式标记我的版本,并且构建根据最后一次使用version.* 标记的提交来计算应用程序的版本。 如果我没有标记给定的提交,那么版本号最终会类似于version.1.14.3-24-ged66bf5,它基于最近的标签、自该标签以来的提交次数和 git 提交 id。

这对我个人来说非常有效,但是在我的 CI 服务器上构建浅层克隆时遇到了问题。

当在 jenkins 中的 git build 上使用“浅克隆”选项时(我猜它只是在执行“--depth=1”),我的 git describe 命令不再执行我想要它执行的操作。 我的版本号最终成为提交 id - 我想这是因为浅克隆中没有标记版本,所以 describe 命令的 --always 参数最终会吐出提交 id。

我暂时可以通过不进行浅层克隆来解决这个问题。

但我真的很喜欢将我的版本控制从 git describe 中移除——即使是浅克隆,我如何才能继续使用它? 我认为我需要能够做的是在浅克隆时指定我希望深度是“从分支的尖端回到具有匹配version.*的标签的最新版本”。

这是我可以用 Git 做的事情吗?

【问题讨论】:

  • 你有没有想过创建一个 git alias 来做到这一点?我绝不是创建复杂工作流程的专家,但我知道您可以通过使用它们来实现非常疯狂的工作流程。或者使用 git hooks 来监听你的部署分支 (post-commit-hook) 并做几乎相同的事情。
  • @JensHöpken 这个 git 别名会是什么样子?

标签: git


【解决方案1】:

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

更准确地说,这取决于该克隆的深度,以及一个人必须在历史上走多远才能找到合适的标签。例如,使用--depth 1000 进行浅层克隆可能就足够了。确切的数字取决于您在1您关心的标签之间有多少次提交。

你是对的,如果 git 提供了一个“deepen until tagged”,那会成功,但 git 没有,更糟糕的是,加深浅层克隆不会自动带来标签。

(可以编写一个使用git ls-remotegit fetch --depth 的脚本来不断加深克隆,直到出现一些标记的提交,然后让脚本手动应用标记。这可能例如,只需要几十行 Python 或 shell 代码,这取决于你想要它的健壮程度。但它不包含在 git 本身中。)


1“之间”的概念在非线性图中有点不确定,但我认为这里的总体概念应该足够清楚。

【讨论】:

    猜你喜欢
    • 2020-06-26
    • 2017-04-25
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    相关资源
    最近更新 更多