繁体   English   中英

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

[英]Always Commit the same file with SVN

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

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

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

基本上,您需要在文件中输出svnversion命令。

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

另一方面,如果你必须将它保存在存储库中,那么在预提交钩子中调用svnversion将是你最好的选择。

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

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

    const long WC_REV = $ WCREV $;

    在名为version.h.tmpl的文件中

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

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

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

SubWCRev文档也可能有所帮助。

我想你可能不明白$ Rev $ flag是如何工作的。 Rev标志的目标不是将此修订始终提交到subversion存储库中。 目标是在更新时,Rev标志将始终是修订版本。 您不应该将代码放入包含修订版的subversion中。 Subversion非常善于为您跟踪这些信息。

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

svn propset svn:keywords "Revision" file.txt

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

@gatekiller:看来TortoiseSVN确实支持Client Side Hooks

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

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

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

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

可以通过将您的网站从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

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

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

预提交挂钩可能有效。

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

我没做的是将其用于下一步:使用Subversion的存储库钩子来自动化该过程。 麻烦的是,我不确定你是否可以在钩子中更改文件内容。 文档似乎暗示你不能。

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

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

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

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

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

有关预提交挂钩的更多信息,我发现此页面很有用。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM