像这个问题,但不需要实际查询SVN服务器。这是一个基于Web的项目,所以我想我会将仓库用作公共视图(除非有人能告诉我这是一个坏主意)。我假设这些信息在.svn
文件夹的某个文件中,但在哪里,以及如何解析它?我想做类似于SO的事情,在右下角显示版本号。
如果您手头有Python或PHP代码,或者只是指点正确的方向,那将不胜感激。
为了达到这个目的,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
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)
$ 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)
$ 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>
simplexml_load_string
,并获取 entry
标签的 revision
属性。请注意,不建议在每个页面视图上执行此操作:速度不如您的应用程序所希望的那样快。相反,我会在创建归档文件时获取修订版本号,稍后将其发送到生产服务器,并将其存储在某种配置文件中。这样,您就不需要在生产服务器上使用 svn
命令,也不需要在该服务器上进行检出。svn info
的方法,但我想这也是一个有效的解决方案。它可能比解析文件产生更一致的信息... 我之前不知道 --xml
选项,这应该会让事情变得更容易。 - mpen这适用于svn版本1.6.2。但请注意,不同的SVN版本使用不同格式的.svn文件夹。
<?php
$contents = file_get_contents(dirname(__FILE__) . '/.svn/entries');
preg_match("/dir\n(.+)/", $contents, $matches);
$svnRevision = $matches[1];
print "This Directory's SVN Revsion = $svnRevision\n";
svn log -q --limit 1 http://svnbox/path/to/repo/trunk \
| php -r 'fgets(STDIN); preg_match("/(\d+)/", fgets(STDIN), $m); echo $m[0];'
我知道这个问题很老了,但是我想提供一下我在我的Web应用程序中如何使用PHP实现这个功能:
将以下代码放入您的应用程序中的PHP文件中,并设置SVN关键字属性为“Date Revision Author HeadURL Id”(文件中的关键字替换)。
$SVN_rev = "\$LastChangedRevision$";
$SVN_headURL = "\$HeadURL$";
function stripSVNstuff($s)
{
$s = substr($s, strpos($s, ":")+1);
$s = str_replace("$", "", $s);
return trim($s);
}
所以在svn对源文件进行关键字替换后,$SVN_rev行将如下所示:
$SVN_rev = "\$LastChangedRevision: 6 $";
因此,stripSVNstuff($SVN_rev)的输出将是“6”(不带引号)。
你可以直接在命令行中运行 svn info 命令。但请记住,这可能是一个混合版本。你也可以运行 svn up 命令,STDOUT 的最后一行将给出修订号。
或者,你想使用 svn API 吗?你还可以查看 TortoiseSVN 代码中的 SubWCRev,它用于将文件中的令牌替换为 WC 的当前修订版本。
shell=True
?请参见 https://docs.python.org/2/library/subprocess.html#frequently-used-arguments - lorenzog