如何在Git中管理版本号?

now*_*wox 25 versioning git version-control

让我们假设在维护blerp命令行工具.这个工具有(隐藏)选项,它返回它的版本(让我们说),另一个返回它的构建提交号.--version0.1.2--commit

版本号和提交号都在代码库上进行了硬编码.

现在我制作一个错误修正,然后提交并重建我的程序.我仍然会看到0.1.2这个新版本与原版0.1.2不同.只有提交会告诉我它不一样0.1.2.这个bugfix值得一个不同的版本号吗?

一种解决方案是每次提交时,我都会增加硬编码版本号(这意味着每次提交时总是修改最少2个文件).这是一个绑定解决方案,当开发人员处理不同的活动分支时,它不起作用.如果Bob foo使用该版本的功能,0.1.2而Alice bar则使用相同版本的功能.他们如何增加版本号?Bob可以使用奇数和Alice使用偶数.如果Eve在第三个功能上工作怎么办?

另一种解决方案是使用Git标签自动生成版本号.脚本可以找到以v此类开头的最接近的标记,v0.1.2并使用标记名称作为版本号加上当前commit(v0.1.2 (build 4acd21))的前n位数.如果工作目录是干净的,这很有效.可以想象*在构建号之前添加一个表示工作目录不干净.这个解决方案的主要问题是如果有人导出源,它将无法构建blerp.

有哪些替代方案可以解决这个问题?

小智 48

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

版本控制方案

版本控制方案有两种类型:

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

人们根据需要使用不同的方案,但语义版本控制被相当广泛使用,并由GitHub的共同创始人Tom Preston-Werner撰写.

语义版本控制

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

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

例如 1.2.0-beta

major or X 如果软件发生重大变化(例如向后不兼容的API发布),则可以递增.

minor or Y 如果引入了向后兼容的API,则递增.

patch or Z 错误修复后增加.

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

通过使用标签:

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

git tag -a "v1.5.0-beta" -m "version v1.5.0-beta"
Run Code Online (Sandbox Code Playgroud)

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

v1.5.0-beta-1-g0c4f33f-1-是提交号和0c4f33fcommit的哈希的缩写.该g前缀代表"git".

可以使用以下方式查看完整的详

git show v1.0.5-beta


Ale*_*lev 17

请看一下git describe命令.此命令显示标记设置后的最新标记和提交量.它还可以显示存储库的肮脏.

正如您所提到的,如果没有安装git存储库(.git文件夹)和git,此命令将无法正常工作.但是,如今没有git,但安装了所有其他工具,这几乎是不可想象的开发人员.


eve*_*ton 5

修订号应该由你维护,而不是由 git 维护。与 SVN 不同的是,每次提交时您都没有递增的修订号,因此 git 无法开箱即用地将您的版本置于上下文中。

  • @HackSaw(或最近的其他人)的比较是与 SVN 的比较,SVN 也没有谈到编码器的_意图_;但是 SVN 是集中式的,可以使用单调递增的计数器,而 Git 必须依靠哈希来生成唯一的 id。 (4认同)
  • 是的。git 名称是从更改派生的哈希值,并不涉及编码人员的 *意图 *。这是一个可释放的东西,还是只是中途停留?吉特不知道。 (2认同)

小智 5

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

  2. 转到 git dir 并在 .git/hooks/ 中创建名为“pre-commit”的文件(不含 .sample)

  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"
Run Code Online (Sandbox Code Playgroud)

为我工作:) 享受吧!

  • 这仍然存在与 OP 所描述的相同的问题,如果您有 3 个人在 3 个不同的分支上工作,他们最终可能会得到相同的构建和/或语义版本。 (2认同)