2012-04-19 130 views
16

我一直使用git流几个月,它工作得很好。我想自动执行“凹凸版”操作。寻找一种方法自动化git流的“凹凸版本”

该项目是PHP和footer.php有一个标记来替换当前的发行标记。我敢肯定,有一些awk的git日志和PHP文件的一切应该工作,但我认为有人已经这样做过...

任何想法?

回答

13

你可以使用the semver gem,增加了一个文件.semver你混帐回购协议的根源。 Semantic version numbers是具有结构化/一致性/有意义的版本号的建议,该gem使其易于实现。

因此,所有你需要做的就是添加:

semver inc major|minor|patch 

到您的工作流程(手动或脚本),使得.semver被释放时更新。

如果你不想ruby依赖,那么semver非常简单,所以sed的一些实验可能会产生一个工作的解决方案。

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  
8

还有(在https://github.com/peritus/bumpversion更多信息)bumpversion那旨在取代那个癫魔。

使用pip install bumpversion进行安装,告诉它哪些文件包含您的版本号以及是否要提交并标记该文件。它也是高度可配置的(默认语义版本化),所以你可以添加一个声明性的配置文件,告诉你如何将这个软件项目的版本升级到你选择的vcs,而其他版本也可以颠覆版本。

+0

这是一个漂亮的小工具Python安装文件进行。谢谢 – Alex 2014-05-01 01:59:20

+0

'bumpversion'似乎已被原始开发者抛弃,但有一个[fork](https://github.com/c4urself/bump2version)更加主动地维护,并增加了一些功能,例如带标签的标签。 – ostrokach 2017-11-17 16:42:12

3

Semver网页状态:

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

  • 当你做出不兼容的API改变主要版本,
  • 次版本时加功能以向后兼容的方式执行,并且当您进行向后兼容的错误修复时,可以使用
  • 修补程序版本。

用于预发布和构建元数据的其他标签可作为MAJOR.MINOR的 扩展。PATCH格式。

Gitflow用来分支的命名惯例,bug修复住上hotfix/和新功能与feature/前缀前缀分支机构。

当这种类型的任何分支合并到发布分支时,这会导致PATCH增加。如果某个功能已被合并,MINOR字段应该增加。

给定一个特定的版本,你应该能够确定是否有任何一个分支已经合并以及哪个字段会碰撞。

困难的部分是找出一个突破性的变化。在过去,我已经考虑在编译代码上使用反射来确定API是否已经改变,但是,我认为在提交消息中使用关键字来指定重大更改会容易得多。

0

您可以自动执行每次提交的版本。 在这里,你可以找到它使用shell脚本,并内置git的钩来完成: https://github.com/addonszz/Galileo/tree/develop/githooks

外壳纸条运行是: https://github.com/evandrocoan/.versioning/blob/master/scripts/updateVersion.sh

关于自动化问题,每一件事情是如何知道你是否正在更新主要,次要,补丁或构建,当你承诺一切。

我的意思是,构建你可以自动化每个开发分支提交,就像上面的链接所做的那样。

补丁,你可以钩住每一个git流修补程序完成。上面的链接只是缺乏挂钩修补程序完成以增加修补程序版本运行: ./githooks/updateVersion.sh patch

但是小和主要没有技巧,他们都在功能完成版本内完成。

观测数据

我找到了解决挂钩预修补程序,提交,它是这样一个问题: How to pre-hook the gitflow hotfix finish?

0

如果我正确理解你的“凹凸版”操作,那么你的意思是增加一旦你开始发布版本号为git flow release start x.x.x的任意数量的文件,版本号也在git标签中表示。

由于Driessen原来的git流已经停止,非官方的继承者似乎是包含大量git流挂钩的Peter van der Does gitflow-avhhttps://github.com/petervanderdoes/gitflow-avh/)。请参阅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的后缀,但可以使用空引号。此外,sed的扩展正则表达式参数在Linux上的命名方式也不相同。