【发布时间】:2016-10-15 07:41:06
【问题描述】:
让我们想象在git 上维护的blerp 命令行工具。这个工具有一个(隐藏的)--version 选项,它返回它的version(比如说0.1.2)和另一个--commit,它返回构建它的提交号。
版本和提交号都硬编码在代码库中。
现在我做了一个错误修复,然后提交并重建我的程序。我仍然会看到0.1.2,尽管这个新版本与原来的 0.1.2 不同。只有提交会告诉我它与 0.1.2 不同。该错误修复是否值得使用不同的版本号?
一种解决方案是,每次提交时,我都会增加硬编码的版本号(这意味着每次提交时始终修改至少 2 个文件)。这是一个绑定解决方案,当开发人员在不同的活动分支上工作时它不起作用。如果 Bob 使用 0.1.2 版本的功能 foo,而 Alice 使用同一版本的 bar 功能。他们如何增加版本号? Bob 可以使用奇数,Alice 可以使用偶数。如果 Eve 开发第三个功能怎么办?
另一种解决方案是使用 Git 标签自动生成版本号。脚本可以找到最近的以v 开头的标签,例如v0.1.2,并使用标签名称作为版本号加上当前提交的前n 位数字(v0.1.2 (build 4acd21))。如果工作目录是干净的,这很有效。可以想象在内部版本号前添加* 表示工作目录不干净。此解决方案的主要问题是,如果有人导出源,它将无法构建 blerp。
有什么可能的替代方案可以解决这个问题?
【问题讨论】:
-
通常,您应该避免将版本放入源文件。理想情况下,您将有一个将版本编码为内部版本号的构建过程。这样,版本就与用于构建它的源代码无关。然后,该过程还可以在某处对提交 id 进行编码,因此您始终知道构建源的来源。至于存储版本号,常见的解决方案是使用标签。这也为您带来了好处,您可以通过查看标签轻松地按版本浏览存储库中的版本。
-
@poke 如果您只是从 SCM 获得源,您如何获得产品中的版本号。
blerp的版本是什么? -
通常,您发布的内容与版本控制中的内容不完全相同。因此,您可以按照我的描述在构建过程中应用该版本。
-
我知道这是一个老问题,但我制作了一个脚本来执行一些版本管理 + 更多功能:github.com/jv-k/bump-version.sh
标签: git git version-control versioning