始终使用SVN提交相同的文件

时间:2008-08-08 13:55:04

标签: svn

在我的网络应用程序中,我有一个文件,它通过$ Rev $保存当前版本号。这项工作正常,但如果我不对该文件进行任何更改,则不会提交。

无论如何,我是否可以强制将单个文件始终提交给SVN服务器?

我正在使用TortoiseSVN for Windows,因此任何代码或分步说明都会有所帮助。

13 个答案:

答案 0 :(得分:13)

基本上,您希望在文件中输出svnversion命令。

此类文件通常保留在存储库之外,并由构建脚本自动创建。我建议你这样做。如果您不构建,而只是在服务器端svn up,只需在svnversion之后调用svn up或创建一个shell脚本来执行这两个操作。

如果您 将其保留在存储库中,则在预提交挂钩中调用svnversion将是您最好的选择。

答案 1 :(得分:9)

如果安装了TortoiseSVN,您还可以使用SubWCRev工具。使用该工具获取修订版,而不是滥用$ REV $关键字。

  1. 创建一个模板文件,其中包含您的定义,可能类似于

    const long WC_REV = $ WCREV $;

    在名为version.h.tmpl

  2. 的文件中
  3. 在每个构建中,调用SubWCRev来创建可在应用程序中使用的“真实”文件:

    SubWCRev path \ to \ workingcopy path \ to \ version.h.tmpl path \ to \ version.h

  4. 这将从version.h.tmpl创建文件version.h,文本$ WCREV $替换为您的工作副本当前所在的修订版。

    docs for SubWCRev也可能会有所帮助。

答案 2 :(得分:6)

我想您可能不了解$ Rev $标志的工作原理。 Rev标志的目标不是将此修订始终提交到subversion存储库中。目标是在更新时,Rev标志将始终是修订版本。 您不需要将代码放入包含修订版的subversion中。 Subversion非常擅长跟踪您的信息。

您可能错过的是,您需要在文件上设置属性,以便正确处理Revision关键字。

svn propset svn:keywords "Revision" file.txt

这将确保无论何时进行更新,$ Rev:xxx $标志都将使用当前版本进行更新。您无需担心它如何提交到存储库。

答案 3 :(得分:4)

@gatekiller:似乎TortoiseSVN确实支持Client Side Hooks

答案 4 :(得分:3)

  

这项工作正常,但是,如果我不对该文件进行任何更改,则不会提交。

如果文件永远不会改变,为什么你需要每次都提交它?

[编辑] @Sean =我理解他正在尝试做什么,但如果文件永远不会通过钩子或其他进程更新,因此永远不会改变,那么SVN将永远不会接收它。

答案 5 :(得分:2)

我建议更改方法,每次提交一个文件意味着隐含地将全局修订号保留在该文件中。用户可能需要另一个关键字 GlobalKey ,其解释不存在here我实际上没有使用过提及的 svnversion 但是,它可能会引导您找到解决方案。< / p>

答案 6 :(得分:2)

可以通过将您的网站从SVN部署到Web服务器的脚本来更改版本号文件吗?

在Windows上不确定,但使用bash脚本,我会做类似的事情。

$ version=$(svnversion)
$ svn export . /tmp/staging/
Export complete.
$ echo "Revision: ${version}" > /tmp/staging/version.txt

然后/tmp/staging/version.txt将包含“Revision:1”(或任何最高版本号)。

您当然可以替换文件中的某些标识符,例如$Rev$(而不是按照上面的示例创建version.txt

答案 7 :(得分:1)

根据您的客户端,其中一些提供了一个预提交挂钩,您可以实现简单地“触摸”文件并将其标记为已更改的内容。如果您使用像Visual Studio这样的东西,您可以创建一个“触摸”文件的后期构建任务,但是您必须确保在提交更改之前进行构建。

答案 8 :(得分:1)

@gradonmantank:因为他希望使用最新版本号更新该文件。你完全读过他的问题吗?

预提交挂钩可能有用。

答案 9 :(得分:1)

我曾经有过手动方式。我将运行一个脚本,使用sed将注释替换为$ Rev $文件中的当前时间戳。这样,文件内容就会改变,Subversion会提交它。

我没有做的是将其用于下一步:使用Subversion's repository hooks自动执行该过程。麻烦的是,我不确定你是否可以在钩子中更改文件内容。文档似乎暗示你不能。

相反,我猜你需要一个小脚本代替svn commit命令执行,该命令首先更新时间戳,然后运行正常提交。

答案 10 :(得分:1)

编辑文件对你没有任何帮助。该文件未在内部提交完整版本,仅替换为关键字。如果你查看存储库中的文件,你会看到这个。

因此,您需要强制以某种方式更新文件。

如果您使用的是Windows平台,则可以使用随TortoiseSVN一起发布的SubWCRev工具。文档here

答案 11 :(得分:1)

您可以使用svn pre-commit-hooks来执行此操作 我想到的一般想法是创建一个在提交之前将新版本号放在文件中(使用svnlook获取)或者可能更改文件上的伪属性(它必须更改或SVN将忽略它)。

有关预提交挂钩的更多信息,我发现this page很有用。

答案 12 :(得分:1)

我认为确保Web应用程序中存在具有SVN修订号的文件的最佳方法是不提交您提交的文件,而是将其作为构建脚本的一部分提取。

如果您使用maven,则可以使用maven-buildnumber-plugin执行此操作。