我有一个SVN存储库,用这种格式检查文件。
<filename>.<ext>-rev<revision number>
还有另一个文件,其中输入了修订号。当构建完成时,则解析该文件并获取具有相应修订号的文件并将其重命名为标准文件名&lt; filename&gt;。&lt; ext&gt;最后的构建完成了。
如何在提交之前获取SVN的更改列表编号?
答案 0 :(得分:3)
我认为你误用了版本控制系统(VCS)。在使用VCS时,您不需要将修订号或日期放入文件名中。 VCS将自动为您存储该信息,作为元数据。
您应该替换旧文件,而不是每次都使用新版本/日期签入新文件。如果由于某种原因需要它们,旧文件将始终在VCS历史记录中可用。除了减少混乱之外,这还有一个优点,即始终保持相同的文件名,这使自动化变得更容易。
此外,作为一般规则,您不希望将已编译的二进制文件提交到源树。您应该只提交构建二进制文件所需的文件(即源文件和生成文件)。
如果你真的想继续目前的计划,那你将遇到困难。在提交成功之前,无法知道您将获得的修订版号 - 这是原子提交概念的基本设计保证。您可以做的最好的事情是添加一个post-commit钩子,它会检出刚刚提交的内容的副本,并将该文件重命名为修订版号。
这意味着文件的名称更改将反映早于修改名称的版本,但是它允许您将文件名修订号与您所做的更改相同,即想想就是你想要的。此技术还将导致每次更改的两次提交。我不推荐它。
答案 1 :(得分:1)
您可以尝试执行svn up
并获取最新版本并使用该rev加1。但正如Mark Dickinson所说,如果其他人更新,那么就会出现问题。
我会尝试不同的方法。
答案 2 :(得分:1)
在执行提交之前,没有安全的方法来获取修订号。这将要求客户端能够锁定存储库。
为什么要为每个新版本签入新文件?我确信有一个更好的解决方案可以解决你想要解决的问题。
答案 3 :(得分:0)
我想我现在已经全面了。
场景是这样的:
从存储库的不同分支检出一些代码。进行修复,并将结果更改提交到该存储库(在签入时获取修订号)。
使用这些更改创建二进制(库)。该库是更大模块的一部分,该二进制文件作为&lt; binary&gt; - &lt; revno&gt;进入该模块。 make文件被修改为拾取此二进制revno并将其重命名为&lt; binary&gt;。它正在使用它来创建更大的模块。
答案 4 :(得分:0)
请查看目前可用的“SvnRev”:
http://www.compuphase.com/svnrev.htm
听起来您正在尝试实施某种CHANGELOG或发布标记系统,用户可以在其中选择不同的发布版本。所以,假设你在这里寻找的是我在类似情况下所做的。我意识到你的问题已经有一年了,但也许其他人会发现这个问题。
我维护了一个单独的文件来存储特别感兴趣的修订历史。我有一些项目,我为整个应用程序制作了“官方”安装程序。通常我不会将生成的代码存储在版本控制系统中,但我们将这些二进制文件视为特殊的。我们希望保留我们提供给用户的确切二进制文件。我们以后不想重建它们,将它们存储在SVN中是一种方便滥用版本控制的方法......
所以我构建了安装程序二进制文件;将安装程序二进制文件提交给SVN;获取我刚刚提交的安装程序的SVN修订版;将修订/日期/注释附加到名为CHANGELOG的文件中;最后我提交了CHANGELOG文件。 CHANGELOG的修订号将是安装程序的一个或多个,但我只关心安装程序的修订号。
为了更加方便,将安装程序复制到Web服务器并放在以安装程序的修订号命名的目录下。但我们总是可以查看CHANGELOG的注释,找到我们想要的安装程序的修订版,并通过该版本进行检查。
我们也可以使用该修订号来检查用于构建安装程序的源代码(您必须确保在源检出/构建和安装程序提交之间没有提交任何更改)。如果你真的不介意浪费磁盘空间,你可以做一个标签;建立;并将安装程序提交回标记。当然,SVN并没有真正的标签,所以你会做一个“svn copy”;但是真正的标记系统不允许你将更改提交回来。