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

时间:2020-03-05 18:38:37  来源:igfitidea点击:

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

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

我正在Windows上使用TortoiseSVN,因此任何代码或者分步说明都将对我们有所帮助。

解决方案

回答

根据客户的不同,其中一些提供了预提交的挂钩,我们可以实现一些简单的"接触"文件并将其标记为已更改的操作。如果我们使用类似Visual Studio的工具,则可以创建将"触摸"文件的构建后任务,但是必须确保在提交更改之前进行了构建。

回答

This work fine except, if I don't make any changes to that file, it doesn't get committed.

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

[编辑]
@Sean =我了解他正在尝试执行的操作,但是如果文件从未通过挂钩或者其他进程进行更新,因此也从未更改过,那么SVN将永远不会对其进行处理。

回答

@gradonmantank:因为他希望使用最新的修订版号来更新该文件。我们是否完整阅读了他的问题?

预先提交的钩子可能会起作用。

回答

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

我没有做的是下一步:使用Subversion的存储库挂钩自动执行该过程。麻烦的是,我不确定是否允许我们更改挂钩中的文件内容。该文档似乎暗示我们不能这样做。

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

回答

@gatekiller:看来TortoiseSVN确实支持客户端挂钩。

回答

提交文件不会对我们有任何好处。该文件未使用内部完整版本提交,而是仅用关键字替换。如果查看存储库中的文件,将会看到此信息。

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

如果我们使用的是Windows平台,则可以使用与TortoiseSVN一起分发的SubWCRev工具。这里的文档。

回答

我们可以使用svn pre-commit-hooks来完成。
我想到的一般想法是创建一个在提交之前将新的修订版本号放入文件中(使用svnlook获取)或者更改文件上的伪属性(必须更改,否则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)。

回答

基本上,我们希望将svnversion命令的输出存储在文件中。

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

另一方面,如果我们必须将其保留在存储库中,那么在预提交钩子中调用svnversion是最佳选择。

回答

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

  • 创建一个包含定义的模板文件,也许像const long WC_REV = $ WCREV $;在名为version.h.tmpl的文件中
  • 在每个版本上,调用SubWCRev创建可在应用程序中使用的"真实"文件:SubWCRev path \ to \ workingcopy path \ to \ version.h.tmpl path \ 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 $标志都会被当前的修订版本所更新。我们无需担心它如何提交到存储库。

回答

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

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