在我的 Web 应用程序中,我有一个通过 $Rev$ 保存当前修订号的文件。这工作正常,除非我不对该文件进行任何更改,它不会被提交。
无论如何我可以强制单个文件始终提交给 SVN 服务器吗?
我正在使用适用于 Windows 的 TortoiseSVN,因此任何代码或分步说明都会有所帮助。
在我的 Web 应用程序中,我有一个通过 $Rev$ 保存当前修订号的文件。这工作正常,除非我不对该文件进行任何更改,它不会被提交。
无论如何我可以强制单个文件始终提交给 SVN 服务器吗?
我正在使用适用于 Windows 的 TortoiseSVN,因此任何代码或分步说明都会有所帮助。
基本上,您希望svnversion
在文件中输出命令。
此类文件通常保存在存储库之外,并由构建脚本自动创建。我建议你这样做。如果您不构建,而只是svn up
在服务器端构建,则只需调用svnversion
之后svn up
或创建一个 shell 脚本来执行这两个操作。
另一方面,如果您必须svnversion
将其保存在存储库中,那么调用预提交挂钩将是您最好的选择。
如果您安装了 TortoiseSVN,您还可以使用 SubWCRev 工具。使用该工具来获取修订,而不是滥用 $REV$ 关键字。
创建一个包含您的定义的模板文件,可能类似于
常量长 WC_REV = $WCREV$;
在名为 version.h.tmpl 的文件中
在每次构建时,调用 SubWCRev 来创建可以在应用程序中使用的“真实”文件:
SubWCRev 路径\to\workingcopy 路径\to\version.h.tmpl 路径\to\version.h
这将从 version.h.tmpl 创建文件 version.h,将文本 $WCREV$ 替换为您的工作副本当前所在的修订版。
SubWCRev的文档也可能有所帮助。
我想你可能不理解 $Rev$ 标志是如何工作的。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
将包含“修订:1”(或任何最高修订号)。
您当然可以替换文件中的某些标识符,例如$Rev$
(而不是version.txt
按照上面的示例创建)
根据您的客户,其中一些提供了一个预提交挂钩,您可以实现一些简单地“接触”文件并将其标记为已更改的东西。如果您使用 Visual Studio 之类的东西,您可以创建一个“接触”文件的后期构建任务,但您必须确保在提交更改之前进行构建。
@gradonmantank:因为他希望用最新的修订号更新该文件。你完全阅读了他的问题吗?
预提交挂钩可能会起作用。
我曾经有一种手动的方式来做到这一点。我将运行一个脚本,该脚本将使用 sed 将注释替换为我的 $Rev$ 文件中的当前时间戳。这样,文件内容会改变,Subversion 会提交它。
我没有做的是把它带到下一步:使用Subversion 的存储库挂钩来自动化这个过程。麻烦的是,我不确定您是否可以更改挂钩中的文件内容。该文档似乎表明您不能。
相反,我猜你需要一个小脚本来代替svn commit
首先更新时间戳然后运行正常提交的命令。
提交文件对你没有任何好处。该文件未与内部完整版本一起提交,它仅被关键字替换。如果您查看存储库中的文件,您将看到这一点。
因此,您需要强制以某种方式更新文件。
如果您在 Windows 平台上,则可以使用随 TortoiseSVN 分发的 SubWCRev 工具。文档在这里。
你可以使用 svn pre-commit-hooks 来做到这一点。
我想到的一般想法是创建一个,在提交之前将新的修订号放入文件中(使用 svnlook 获取它)或者可能更改文件上的虚假属性(它必须更改或 SVN 将忽略它)。
有关预提交挂钩的更多信息,我发现此页面很有用。
我认为确保您的 Web 应用程序中存在具有 SVN 修订号的文件的最佳方法是不提交您提交的文件,而是将其提取为构建脚本的一部分。
如果你使用 maven,你可以使用 maven-buildnumber-plugin 来做到这一点。