如何编程获取SVN版本号?

2024-06-11 11:42:25 发布

您现在位置:Python中文网/ 问答频道 /正文

Like this question,但不需要实际查询SVN服务器。这是一个基于web的项目,所以我想我只使用存储库作为公共视图(除非有人能告诉我为什么这是个坏主意)。我假设这些信息在.svn文件夹的某个文件中,但是在哪里,以及如何解析它?我想做一些类似的事情,在右下角进行修改。

如果您手头有Python或PHP代码,或者只是指向正确方向的一点,您会很感激。


Tags: 文件项目服务器文件夹视图web信息svn
3条回答

您可以在命令行上使用“svn info”获取签出的当前修订号。

例如:

$ svn info
Chemin : .
URL : http://.../trunk
Racine du dépôt : http://...
UUID du dépôt : 128b9c1a-...-612a326c9977
Révision : 185
Type de nœud : répertoire
Tâche programmée : normale
Auteur de la dernière modification : ...
Révision de la dernière modification : 185
Date de la dernière modification: 2009-09-28 20:12:29 +0200 (lun. 28 sept. 2009)

注意它是本地化的;如果您在Linux上,可以尝试使用:

$ LANG=en svn info
svn: warning: cannot set LC_CTYPE locale
svn: warning: environment variable LANG is en
svn: warning: please check that your locale name is correct
Path: .
URL: http://.../trunk
Repository Root: http://...
Repository UUID: 128b9c1a-...-612a326c9977
Revision: 185
Node Kind: directory
Schedule: normal
Last Changed Author: mzeis
Last Changed Rev: 185
Last Changed Date: 2009-09-28 20:12:29 +0200 (Mon, 28 Sep 2009)

不过,如果从PHP使用它,以XML形式获取它可能会更有帮助(更容易解析,而且不支持区域设置):

$ svn info --xml
<?xml version="1.0"?>
<info>
<entry
   kind="dir"
   path="."
   revision="185">
<url>http://.../trunk</url>
<repository>
<root>http://...</root>
<uuid>128b9c1a-...-612a326c9977</uuid>
</repository>
<wc-info>
<schedule>normal</schedule>
<depth>infinity</depth>
</wc-info>
<commit
   revision="185">
<author>...</author>
<date>2009-09-28T18:12:29.130307Z</date>
</commit>
</entry>
</info>

只需在上面使用^{},并获取entry标记的revision属性。


请注意,我不会在每个页面视图上都这样做:速度不如人们希望的那样快。

相反,我在创建归档文件时会得到修订号,稍后会发送到生产服务器,并将其存储在某种配置文件中。

这样,您就不需要在生产服务器上使用svn命令,也不需要在该服务器上执行签出操作。

我可能会使用post commit钩子将版本号写到网站中的某个文本文件中,然后在加载页面时读取该文件。

More on using hooks here

Subversion包含了用于此目的的svnversion工具。工作副本实际上可能有局部修改,也可能由多种修改组成。svnversion知道如何处理这个问题;请参阅链接文档中的示例。

您可以从python中调用svnversion,如下所示:

import subprocess

def svnversion():
    p = subprocess.Popen("svnversion", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    (stdout, stderr) = p.communicate()
    return stdout

相关问题 更多 >