如何确定植根于目录中的最新SVN版本号?

时间:2020-03-05 18:51:21  来源:igfitidea点击:

我想开始用最新的SVN版本号标记已部署的二进制文件。

但是,由于SVN是基于文件的,而不是基于目录/项目的,因此我需要浏览所有目录和子目录的文件,以确定最高的修订号。

在根目录上使用svn info不起作用(它仅报告该目录的版本,而不报告子目录中的文件):

我想知道是否有使用svn命令的快捷方式来做到这一点。否则,任何人都可以建议一个简单的网络高效脚本(如果它根本不影响远程服务器,我希望这样做)?

我也知道一种替代方法是使用svn:keywords保留版本文件。这行得通(我已经在其他项目上使用过它),但是我厌倦了确保文件不脏以及无法避免的合并冲突。

回答我看到我的问题在于在根目录中调用svn info之前没有做适当的svn up

$ svn info
Path: .
...
Last Changed Author: fak
Last Changed Rev: 713
Last Changed Date: 2008-08-29 00:40:53 +0300 (Fri, 29 Aug 2008)

$ svn up
At revision 721.

$ svn info
Path: .
...
Revision: 721
Last Changed Author: reuben
Last Changed Rev: 721
Last Changed Date: 2008-08-31 22:55:22 +0300 (Sun, 31 Aug 2008)

解决方案

回答

单程。当我们签出代码时,请看svn输出的最后一行:

$ svn up
...stuff...
Updated to revision 66593.

更直接的方法:

$ svn info
Path: .
URL: https://svn.example.com/svn/myproject/trunk
Repository Root: https://svn.example.com/svn/
Repository UUID: d2a7a951-c712-0410-832a-9abccabd3052
Revision: 66593
Node Kind: directory
Schedule: normal
Last Changed Author: bnguyen
Last Changed Rev: 66591
Last Changed Date: 2008-09-11 18:25:27 +1000 (Thu, 11 Sep 2008)

回答

" svn信息"将显示工作副本的修订号(请参见" svn信息"输出中的"修订"行)。构建系统可能允许我们将" svn信息"输出的相关部分放置在应用程序中可以反映出来的地方。例如,我们可以指定在构建时应创建一个临时(未版本控制)文件,其中包含" svn info"的输出;然后在编译时包含此文件。

回答

我不知道我们是否使用MSBuild(Visual Studio)构建二进制文件。
但是,如果我们愿意:
Subverion和MSBuild之间可能存在连接
MSBuild社区任务项目

这是构建脚本的一部分:我们的(C#)应用程序获取包含的svn修订版号:

<SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="installationpath\of\subversion\bin">
     <Output TaskParameter="Revision" PropertyName="Revision" />
  </SvnVersion>
  <Message Text="Version: $(Major).$(Minor).$(Build).$(Revision)"/>
...
    AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)"
     AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)"

一月

回答

@Charles Miller和@Troels Arvin提供的答案是正确的,我们可以使用svn update或者svn info的输出,但是正如我们所暗示的,后者仅在存储库是最新的时才有效。再说一次,我不确定如果源代码树的一部分与另一部分不在同一版本上,那么任何修订号将给我们带来什么价值。在我看来,确实听起来像我们应该在同质树上工作。
我建议或者在运行信息之前进行更新(或者如果我们已经为自己的构建进行了更新,那么我们就很满意),或者建议使用" svn info URL-to-source"。

回答

svnversion似乎是最干净的方法:

svnversion -c /path/to/your-projects-local-working-copy/. | sed -e 's/[MS]//g' -e 's/^[[:digit:]]*://'

上面的命令将从输出中清除所有M和S字母(指示本地修改或者切换),以及较小的修订号,以防svnversion返回一个范围而不是一个修订号(有关更多信息,请参阅文档)。如果我们不想过滤输出,请取出管道和该命令的sed部分。

如果要使用svn info,则还需要使用" recursive"(-R)参数来从所有子目录中获取信息。由于输出随后变成一长串,因此我们需要进行一些过滤以从所有最高的修订号中获取最后更改的修订号:

svn info -R /path/to/your-projects-local-working-copy/. | awk '/^Last Changed Rev:/ {print $NF}' | sort -n | tail -n 1

该命令的作用是将所有包含字符串" Last Changed Rev"的行,然后删除除最后一个字段(即修订号)之外的所有这些行中的所有内容,然后对这些行进行数字排序并删除除了最后一行以外的所有内容,仅产生最高的修订号。例如,如果我们运行的是Windows,则可以肯定也可以在PowerShell中轻松完成此操作。

请清楚一点:以上方法为我们提供了本地工作副本所代表的存储库中路径的递归上次更改修订版本号,而无需访问服务器。因此,如果有人在我们上次svn update之后将此路径中的某些内容更新到存储库服务器中,则该内容将不会反映在此输出中。

如果我们要的是服务器上此路径的最后更改版本,则可以执行以下操作:

svn info /path/to/your-projects-local-working-copy/.@HEAD | awk '/^Last Changed Rev:/ {print $NF}'

回答

这个问题重复。正如我在此处发布的,svnversion命令是朋友。无需解析输出,无需先更新,即可完成工作。

回答

有一个与Subversion一起发行的名为svnversion的程序,可以完成我们想做的事情。这就是我们标记网站的方式。