【发布时间】:2008-08-08 13:55:04
【问题描述】:
在我的网络应用程序中,我有一个通过 $Rev$ 保存当前修订号的文件。这工作正常,除非我不对该文件进行任何更改,它不会被提交。
我是否可以强制单个文件始终提交到 SVN 服务器?
我正在使用适用于 Windows 的 TortoiseSVN,因此任何代码或分步说明都会有所帮助。
【问题讨论】:
标签: svn
在我的网络应用程序中,我有一个通过 $Rev$ 保存当前修订号的文件。这工作正常,除非我不对该文件进行任何更改,它不会被提交。
我是否可以强制单个文件始终提交到 SVN 服务器?
我正在使用适用于 Windows 的 TortoiseSVN,因此任何代码或分步说明都会有所帮助。
【问题讨论】:
标签: svn
基本上,您希望将svnversion 命令的输出保存在一个文件中。
此类文件通常被保存在存储库之外,并由构建脚本自动创建。我建议你这样做。如果您不构建,而只是在服务器端构建 svn up,则只需在 svn up 之后调用 svnversion 或创建一个 shell 脚本来执行这两个操作。
另一方面,如果您必须将其保存在存储库中,那么在预提交挂钩中调用 svnversion 将是您的最佳选择。
【讨论】:
如果您安装了 TortoiseSVN,您还可以使用 SubWCRev 工具。使用该工具获取修订,而不是滥用 $REV$ 关键字。
创建一个包含您的定义的模板文件,可能类似于
const long WC_REV = $WCREV$;
在名为 version.h.tmpl 的文件中
在每次构建时,调用 SubWCRev 以创建您可以在应用程序中使用的“真实”文件:
SubWCRev 路径\to\workingcopy 路径\to\version.h.tmpl 路径\to\version.h
这将从 version.h.tmpl 创建文件 version.h,将文本 $WCREV$ 替换为您的工作副本当前所在的修订版。
docs for 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,它的不存在被解释了here我实际上没有使用提到的svnversion,但是它可能会引导你找到一个解决方案。
【讨论】:
将您的网站从 SVN 部署到网络服务器的脚本能否更改修订号文件?
不确定在 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's repository hooks 来自动化这个过程。麻烦的是,我不确定您是否可以更改挂钩中的文件内容。文档似乎表明您不能。
相反,我猜你需要一个小脚本来代替 svn commit 命令,该命令首先更新时间戳,然后运行正常的提交。
【讨论】:
你可以使用 svn pre-commit-hooks 来做到这一点。
我想到的一般想法是创建一个,在提交之前将新的修订号放入文件中(使用 svnlook 获取它)或者可能更改文件上的虚假属性(它必须更改或 SVN 将忽略它)。
我发现this page 有用。
【讨论】:
我认为确保您的 Web 应用程序中存在具有 SVN 修订号的文件的最佳方法是不提交您提交的文件,而是将其提取为构建脚本的一部分。
如果你使用 maven,你可以使用 maven-buildnumber-plugin 来做到这一点。
【讨论】:
提交文件对您没有任何好处。该文件未与内部完整版本一起提交,它仅被关键字替换。如果您查看存储库中的文件,您会看到这一点。
因此,您需要强制以某种方式更新文件。
如果您在 Windows 平台上,您可以使用 SubWCRev 工具,它与 TortoiseSVN 一起分发。文档here。
【讨论】: