寻找一种使用git flow自动升级版本号的方法

20

我已经使用Git Flow几个月了,效果非常好。我想自动化“增加版本”操作。

这个项目是PHP编写的,footer.php文件有一个令牌需要用当前发布标签替换。我敢肯定通过对git日志和PHP文件进行一些awk处理,一切都应该能够解决,但我认为肯定有人之前已经做过这件事了...

有任何想法吗?


我编写了这个脚本,自动化了许多预发布步骤,包括版本升级功能。希望它能帮助任何想要自动执行这些步骤的人。https://github.com/jv-k/bump-version.sh - jv-k
8个回答

18
你可以使用semver gem,它会在git存储库的根目录下添加一个文件.semver语义化版本号是一种建议,用于拥有结构化/一致/有意义的版本号,该gem使其易于实现。

所以,你需要做的就是添加:

semver inc major|minor|patch

将 .semver 在发布期间更新到您的工作流程中(手动或脚本方式)。
如果您不想使用 ruby 依赖项,那么 semver 是相当简单的,因此进行一些 sed 实验很可能会得到一个可行的解决方案。

你可以使用类似于 https://gist.github.com/acucchieri/69bc649abde55315fe74bb68be82e0c8 的 shell 脚本。 - acucchieri
@acucchieri,请写下您的答案,如果您有不同的方法。 - AD7six
抱歉11年后才评论。https://github.com/flazz/semver看起来已经被放弃了。有没有其他替代项目? - alper

12

还有一个bumpversion(更多信息请参见https://github.com/peritus/bumpversion),旨在取代sed魔法。

使用pip install bumpversion安装,告诉它哪些文件包含您的版本号以及是否要提交和标记。它也高度可配置(默认使用语义化版本控制),所以您可以为此软件项目添加声明性的配置文件以指导如何提升版本,并将其添加到您选择的版本控制系统中使其他人也可以提升版本。


3
“bumpversion”似乎已被原开发者放弃,但有一个更活跃的分支,并添加了一些功能,如注释标签。 - ostrokach
看起来 bump2version 也被放弃了。 - alper

10

3

Semver网页说明:

给定一个版本号MAJOR.MINOR.PATCH,增加:

  • 当您进行不兼容的API更改时,增加 MAJOR 版本号。
  • 当您以向后兼容的方式添加功能时,增加 MINOR 版本号。
  • 当您进行向后兼容的错误修复时,增加 PATCH 版本号。

作为扩展,可以使用附加标签来指定预发布和构建元数据,这些标签遵循 MAJOR.MINOR.PATCH 格式。

Gitflow为分支使用命名约定,修复缺陷的分支以 hotfix/ 为前缀,并且新功能则以 feature/ 为前缀。

当任何此类型的分支合并到发布分支中时,将导致 PATCH 增加。如果已经合并了功能,则应增加 MINOR 字段。

给定特定的修订版本,您应该能够确定是否已合并任何分支以及要增加哪个字段。

难点在于找出重大变化。 过去,我曾考虑过在编译代码上使用反射来确定API是否发生了更改,但是,我认为最简单的方法可能只是在提交消息中使用关键字来指定重大更改。


2

你也可以查看我的存储库Using-bumpversion-package,它目前是针对可修改的Python设置文件而制作的。


1
这是我们在constants.h中用来增加版本号的代码:
constants='../Include/constants.h'

# Get the current build number
currentbuild=`grep PRODUCT_BUILD $constants|sed 's/[^0-9]//g'`
currentversion=`grep PRODUCT_VERSION $constants|sed 's/[^.0-9]//g'`

echo "currentbuild=$currentbuild and currentversion=$currentversion"
newver=$((1+$currentbuild))

# Update the build number on-disk:
cp $constants /tmp/constants
if sed -e "/PRODUCT_BUILD/ s/[0-9][0-9]*/${newver}/" < /tmp/constants > $constants
then    
    echo "Updated build number from $currentversion.$currentbuild to $currentversion.$newver."
    cd ../Include
    # Check it into version control
    svn ci -m "updated build number to ${currentversion}.${newver} for $buildid in $buildroot"
else
    echo "There was a problem updating $constants to build $newver"
fi    

1
如果我正确理解了您的“bump version”操作,那么您的意思是在使用git flow release start x.x.x开始发布后,将任意数量的文件中的版本号增加,其中版本号也表示在git标签中。
由于Driessen的原始git-flow已经停止维护,非官方的继承者似乎是Peter van der Does的gitflow-avh (https://github.com/petervanderdoes/gitflow-avh/),其中包含大量的git flow钩子。请参见https://github.com/petervanderdoes/gitflow-avh/tree/develop/hooks以获取完整列表。
我在post-flow-release-start上使用了这个小脚本进行版本升级:
VERSION=$1

# Get rid of version prefix
STRIPPED_VERSION=`echo $VERSION | cut -d'v' -f 2`
sed -i '' -E "s/^([ |#|[:alpha:]]*)\[.*\]$/\1[$STRIPPED_VERSION]/1" ./README.md
sed -i '' -E "s/^([\t| ]*\"version\": )\".*\"/\1\"$STRIPPED_VERSION\"/1" ./package.json
git commit -a -m "version $STRIPPED_VERSION"

exit 0

这有点死板,因为两个文件是硬编码的(README.md和package.json)。您可以搜索上一个标签的旧版本,然后在循环中替换所有配置的文件。

注意事项:
OSX需要sed -i的后缀,但您可以使用空引号。此外,在Linux上,sed的扩展正则表达式参数名称不同。


0

您可以在每次提交时自动进行版本更新。

这里可以使用shell脚本和内置的git hook来完成:

https://github.com/addonszz/Galileo/tree/develop/githooks

要运行的shell脚本是:

https://github.com/evandrocoan/.versioning/blob/master/scripts/updateVersion.sh

自动化所有事物的问题在于,当您正在提交所有内容时,如何知道是否正在更新Major、Minor、Patch或Build。

我的意思是,对于Build,您可以自动化每个开发分支提交,就像上面的链接中所做的那样。

对于Patch,您可以将每个git flow hotfix完成挂钩。 上面的链接仅缺少将hotfix finish钩住以增加修补程序版本的运行方式:

./githooks/updateVersion.sh patch

但是对于次要和主要的版本,没有什么诀窍,它们都在特性完成发布中完成。

注意

我找到了一个钩子预热修补提交的解决方案,它在这个问题上: 如何预先挂钩gitflow热修复完成?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接