我已经使用Git Flow几个月了,效果非常好。我想自动化“增加版本”操作。
这个项目是PHP编写的,footer.php文件有一个令牌需要用当前发布标签替换。我敢肯定通过对git日志和PHP文件进行一些awk处理,一切都应该能够解决,但我认为肯定有人之前已经做过这件事了...
有任何想法吗?
我已经使用Git Flow几个月了,效果非常好。我想自动化“增加版本”操作。
这个项目是PHP编写的,footer.php文件有一个令牌需要用当前发布标签替换。我敢肯定通过对git日志和PHP文件进行一些awk处理,一切都应该能够解决,但我认为肯定有人之前已经做过这件事了...
有任何想法吗?
.semver
。语义化版本号是一种建议,用于拥有结构化/一致/有意义的版本号,该gem使其易于实现。
所以,你需要做的就是添加:
semver inc major|minor|patch
还有一个bumpversion(更多信息请参见https://github.com/peritus/bumpversion),旨在取代sed魔法。
使用pip install bumpversion
安装,告诉它哪些文件包含您的版本号以及是否要提交和标记。它也高度可配置(默认使用语义化版本控制),所以您可以为此软件项目添加声明性的配置文件以指导如何提升版本,并将其添加到您选择的版本控制系统中使其他人也可以提升版本。
Semver网页说明:
给定一个版本号MAJOR.MINOR.PATCH,增加:
- 当您进行不兼容的API更改时,增加 MAJOR 版本号。
- 当您以向后兼容的方式添加功能时,增加 MINOR 版本号。
- 当您进行向后兼容的错误修复时,增加 PATCH 版本号。
作为扩展,可以使用附加标签来指定预发布和构建元数据,这些标签遵循 MAJOR.MINOR.PATCH 格式。
Gitflow为分支使用命名约定,修复缺陷的分支以 hotfix/
为前缀,并且新功能则以 feature/
为前缀。
当任何此类型的分支合并到发布分支中时,将导致 PATCH
增加。如果已经合并了功能,则应增加 MINOR 字段。
给定特定的修订版本,您应该能够确定是否已合并任何分支以及要增加哪个字段。
难点在于找出重大变化。 过去,我曾考虑过在编译代码上使用反射来确定API是否发生了更改,但是,我认为最简单的方法可能只是在提交消息中使用关键字来指定重大更改。
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
git flow release start x.x.x
开始发布后,将任意数量的文件中的版本号增加,其中版本号也表示在git标签中。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
的扩展正则表达式参数名称不同。
您可以在每次提交时自动进行版本更新。
这里可以使用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热修复完成?