如何管理Git中的版本号?

How to manage the version number in Git?

让我们想象一下 blerp command line tool maintained on . This tool has the (hidden) --version option which returns its version(假设 0.1.2)和另一个 --commit,其中 returns 是构建它的提交编号。

版本和提交号都硬编码在代码库中。

现在我修复了一个错误,然后提交并重建我的程序。我仍然会看到 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.

有什么可能的替代方法可以解决这个问题?

如您所说,版本控制问题通常在 git 中使用 branchtags(如 semantic versioning 模式)解决。

更好的方法是使用 git 仅跟踪代码库中的更改,忽略(使用 .gitignore 文件)构建文件并维护干净的存储库。

构建结果(pre/compiled 文件、可执行文件、分发文件、zip、exe...)可能取决于环境变量(平台、系统架构等) ) 并且应该在注册表中单独保存。

如果代码库非常大且难以维护,也许您应该考虑将其划分为更小的组件(或git submodule)以避免在开发时出现交叉依赖。

修订号应该由您维护,而不是由 git 维护。与 SVN 不同,每次提交都不会增加修订号,没有开箱即用的方法 git 来了解您的版本是什么。

请看一下 git describe 命令。此命令向您显示最新的标记和设置标记后所做的提交量。也可以显示存储库的脏度。

如您所述,如果没有安装 git 存储库(.git 文件夹)和 git,此命令将无法运行。但是,如果没有 git 但安装了所有其他工具,今天的开发人员几乎无法想象。

Alexey Kiselev 和 Dario 已经暗示了答案,但我会尝试详细解释。

版本控制方案

有两种版本控制方案:

  1. 内部版本号:一天内可以递增多次(例如版本控制号)
  2. 发布版本:更改频率较低(例如语义版本控制)

People use different schemes as per their need, but semantic versioning 的使用相当广泛,作者是 GitHub 的联合创始人 Tom Preston-Werner。

语义版本控制

语义版本控制遵循 X.Y.Z

的模式

或者更具可读性的是 [major].[minor].[patch]-[build/beta/rc]

例如1.2.0-beta

major or X 可以在软件发生重大变化时增加,例如向后不兼容的 API 版本。

如果引入向后兼容的 API,

minor or Y 会递增。

patch or Z 在错误修复后递增。

我们如何使用 Git 实现这一目标?

通过使用标签:

Git中的标签可用于添加版本号。

git tag -a "v1.5.0-beta" -m "version v1.5.0-beta"

将 v1.5.0-beta 的版本标记添加到您当前的 Git 存储库。此后的每个新提交都将通过附加提交编号和提交哈希来自动递增标记。这可以使用 git describe 命令查看。

v1.5.0-beta-1-g0c4f33f这里-1-是commit number,0c4f33f是commit's hash的缩写。 g 前缀代表 "git".

可以使用以下方式查看完整的详细信息:

git show v1.5.0-beta

  1. 在项目目录(或您想要的位置)创建文件build_number并将其值 1 放入此文件

  2. 转到 git 目录并在 .git/hooks/(没有 .sample)中创建名为“pre-commit”的文件

  3. 把这段代码放在那里

#!/bin/sh

currentbuildnumber=cat build_number let "currentbuildnumber++" printf $currentbuildnumber > build_number currentbranch=git branch | tr -cd "[:alpha:]" git log $currentbranch --pretty=format:"%h - %an, %ar : %s, Build: $currentbuildnumber"

为我工作:) 享受!