8

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

#!/bin/sh

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

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

更新:因为也许我还不清楚,我会尝试更详细的解释:假设我有这个 repo:/svn/repos/project/trunk/,其中我有一个名为 version.ini 的文件,它受版本控制。我想要做的是在每次提交时将该文件更新为新版本。假设当前版本为 263,我希望该文件中写入 263。并且要回复下面的答案,您不能使用关键字,因为它们仅在我更新该文件并且我不想这样做时才起作用。

希望我有道理,并感谢您提供的任何帮助。干杯

4

2 回答 2

7

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

现在,要回答你的字面问题,想想在 svn 钩子脚本中你能做什么和不能做什么仍然很有趣:

您不能从提交后挂钩更改提交

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

您也不能从预提交挂钩修改待处理的提交

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

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

于 2009-03-17T00:02:18.483 回答
5

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

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

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

另一种解决方案是向您的构建工具/Makefile/whatever 添加一个规则,该规则在svn info项目的根目录中使用以确定当前修订并将其放入临时文件(添加到您的存储库中)。

于 2009-03-16T12:36:20.550 回答