将当前的svn版本写入文本文件

时间:2009-12-01 11:48:37

标签: ruby-on-rails svn

我有一个rails网站。我想,在mongrel重新启动时,将当前的svn版本写入public / version.txt,以便我可以将其放入页眉中的注释中。

问题是获得当前本地版本的svn - 我有点困惑。

例如,如果我对一段尚未更新的文件进行svn更新,我会得到“修订版4571”。但是,如果我做svn信息,我得到

路径:。
网址:http://my.url/trunk
存储库根目录:http://my.url/lesson_planner
存储库UUID:#########
修订版:4570
节点种类:目录
时间表:正常
最后更改作者:最大
最后更改版本:4570
最后更改日期:2009-11-30 17:14:52 +0000(星期一,2009年11月30日)

请注意,这表示修订版4570,比上一个命令低1。

任何人都可以直截了当地告诉我如何简单地获取当前的版本号吗?

谢谢,最大

5 个答案:

答案 0 :(得分:6)

Subversion带有一个完成此操作的命令:SVNVERSION.EXE

用法:svnversion [OPTIONS] [WC_PATH [TRAIL_URL]]

为工作副本路径生成紧凑的“版本号”   WC_PATH。 TRAIL_URL是用于的URL的尾部   确定WC_PATH本身是否已切换(检测到开关   在WC_PATH中不依赖于TRAIL_URL)。版本号   被写入标准输出。例如:

$ svnversion . /repos/svn/trunk 
4168

如果工作,版本号将是单个数字   复制是单个修订,未修改,未切换和使用   与TRAIL_URL参数匹配的URL。如果工作   复制是不寻常的版本号会更复杂:

4123:4168混合修订工作副本
   4168M修改后的工作副本
   4123S切换工作副本
   4123:4168MS混合修订,修改,切换工作副本

如果在不是工作副本的目录上调用,则为   导出的目录说,程序将输出'exported'。

如果没有参数调用,WC_PATH将是当前目录。

有效选项:   -n [--no-newline]:不输出尾随换行符   -c [--committed]:最后更改而不是当前修订   -h [--help]:显示此帮助   --version:显示版本信息

答案 1 :(得分:4)

我使用以下shell脚本片段创建一个头文件svnversion.h,它定义了我在编译代码中使用的一些常量字符串。你应该能够有类似的东西:

#!/bin/sh -e

svnversion() {
    svnrevision=`LC_ALL=C svn info | awk '/^Revision:/ {print $2}'`
    svndate=`LC_ALL=C svn info | awk '/^Last Changed Date:/ {print $4,$5}'`

    now=`date`

    cat <<EOF > svnversion.h

// Do not edit!  This file was autogenerated
//      by $0
//      on $now
//
// svnrevision and svndate are as reported by svn at that point in time,
// compiledate and compiletime are being filled gcc at compilation

#include <stdlib.h>

static const char* svnrevision = "$svnrevision";
static const char* svndate = "$svndate";
static const char* compiletime = __TIME__;
static const char* compiledate = __DATE__;

EOF
}

test -f svnversion.h || svnversion

这假设您将删除创建的头文件以触发构建新头文件。

答案 2 :(得分:2)

如果您只想打印存储库的最新版本,可以使用以下内容:

svn info <repository_url> -rHEAD | grep '^Revision: ' | awk '{print $2}'

您可以使用capistrano进行部署,它会创建REVISION文件,您可以将其复制到public / version.txt

答案 3 :(得分:1)

您似乎在目录上运行svn info,但在特定文件上运行svn update。如果您将目录更新为版本4571,则应打印svn info

  

路径:。

     

网址:http://my.url/trunk

     

存储库根目录:http://my.url/lesson%5Fplanner

     

存储库UUID:#########

     

修订版:4571

     

[...]

     

Last Changed Rev:4571

请注意,“上次更改的修订版”不一定与存储库的最新版本保持一致。

答案 4 :(得分:0)

感谢所有建议使用capistrano和svninfo的人。

我们确实使用了capistrano,它确实制作了这个REVISION文件,我想我之前看过但是没有注意。但事实上,这并不是我所需要的,因为它只在部署时得到更新,而有时我们可能偷偷地更新几个文件然后重新启动,而不是进行完全部署。

我最终使用svninfo,grep和awk做了我自己的文件,就像很多人在这里建议的那样,并把它公之于众。这是在mongrel start上创建的,这是部署过程和重启过程的一部分,因此两次都会完成。

谢谢大家!