post commit hook更新版本下的文件

时间:2009-03-16 12:16:12

标签: svn hook post-commit

我创建了一个名为version.ini的文件,该文件受版本控制(/trunk/version.ini) 我现在想做一个post commit钩子来用最新版本更新该文件。 但我不知道什么命令可以做到这一点。我知道我有这个参数:

#!/bin/sh

REPOS = "$1"
REV = "$2" 

但是如何在不进行新修订的情况下替换该文件的内容?我的回购中仍然有这些变化吗?

更新: 因为也许我不清楚我会尝试更详细的探索: 让我说我有这个repo:/ svn / repos / project / trunk /并且在其中我有一个名为version.ini的文件,它受版本控制。我想要做的是每次提交更新该文件到新版本。让我们说当前的版本是263我希望该文件中有263个写入。 并回答一个答案,你不能使用关键字,因为他们只有工作,如果我更新该文件,我不想这样做。

希望我有道理,感谢你给予的任何帮助。 干杯

2 个答案:

答案 0 :(得分:7)

您真正想要的不是修改提交的方法,而是svn:keywords之类的内容。不幸的是,正如你可以在“$ Global $ Rev $?”框中读到的那样。这并没有真正做你想要的。相反,您必须编写一个脚本来调用和解析svnversion的输出,并以某种方式将结果作为构建的一部分放在您的文件中。

现在,为了回答你的文字问题,考虑在svn钩子脚本中你能做什么和不能做什么仍然很有趣:

您无法通过提交后挂钩

更改提交

在提交后挂钩运行时,提交已经完成(顾名思义),因此更改文件是不可能的。此时您只能检查更改。

您无法修改预提交挂钩中的待处理提交

您可以使用带有--transaction开关的svnlook工具检查预提交挂钩中的待处理事务的内容,但不能更改它。

如果可以在预提交挂钩中进行任意更改,那么服务器显然需要将这些更改报告给svn客户端。否则,客户端会认为他的文件处于提交的修订版本,而实际上它们实际上是不同的。如果svn客户端接受此类报告的更改,则可能导致您的工作被提交消灭。对于版本控制系统而言,这将是一个令人惊讶的特征,温和地说。不用说颠覆不允许这样做。

答案 1 :(得分:5)

如果不修改修订号,就无法更改仓库中的任何内容。

解决方案是将special keywords(搜索svn:keywords)放入文件中,并在结帐时让SVN替换它们。看起来这些值来自存储库,但存储库中文件的表示不会改变。

你可能正在寻找$ LastChangedRevision $(或简称$ Rev $)。

另一种解决方案是在构建工具/ Makefile /项目根目录中使用svn info的任何内容中添加规则,以确定当前版本并将其放入临时文件(添加到您的回购中。)