10

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

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

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

4

13 回答 13

13

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

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

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

于 2009-02-24T13:31:50.430 回答
9

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

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

    常量长 WC_REV = $WCREV$;

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

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

    SubWCRev 路径\to\workingcopy 路径\to\version.h.tmpl 路径\to\version.h

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

SubWCRev的文档也可能有所帮助。

于 2009-02-25T18:32:54.177 回答
6

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

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

svn propset svn:keywords "Revision" file.txt

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

于 2009-03-02T15:49:37.070 回答
4

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

于 2008-08-08T14:28:17.087 回答
3

这工作正常,除非我不对该文件进行任何更改,它不会被提交。

如果文件从不更改,为什么每次都需要它提交?

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

于 2008-08-08T14:08:33.957 回答
2

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

于 2009-02-24T12:09:28.133 回答
2

将您的网站从 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按照上面的示例创建)

于 2009-02-24T12:48:16.200 回答
1

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

于 2008-08-08T14:07:49.357 回答
1

@gradonmantank:因为他希望用最新的修订号更新该文件。你完全阅读了他的问题吗?

预提交挂钩可能会起作用。

于 2008-08-08T14:12:15.463 回答
1

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

我没有做的是把它带到下一步:使用Subversion 的存储库挂钩来自动化这个过程。麻烦的是,我不确定您是否可以更改挂钩中的文件内容。该文档似乎表明您不能。

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

于 2008-08-08T14:15:49.717 回答
1

提交文件对你没有任何好处。该文件未与内部完整版本一起提交,它仅被关键字替换。如果您查看存储库中的文件,您将看到这一点。

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

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

于 2008-08-08T14:28:52.887 回答
1

你可以使用 svn pre-commit-hooks 来做到这一点。
我想到的一般想法是创建一个,在提交之前将新的修订号放入文件中(使用 svnlook 获取它)或者可能更改文件上的虚假属性(它必须更改或 SVN 将忽略它)。

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

于 2008-08-08T14:48:29.213 回答
1

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

如果你使用 maven,你可以使用 maven-buildnumber-plugin 来做到这一点。

于 2009-03-02T22:03:37.607 回答