Like this question,但无需实际查询SVN服务器。这是一个基于Web的项目,所以我想我将只使用存储库作为公共视图(除非有人可以告诉我为什么这是一个坏主意)。我假设此信息位于.svn
文件夹中的某个文件中,但是在哪里,以及如何解析它?我想做一些像SO那样的事情,在右下角进行修改。
Python或PHP中的代码如果您手头有它,或者只是朝着正确的方向指出,那就很感激了。
答案 0 :(得分:13)
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
答案 1 :(得分:4)
我可能会使用post-commit钩子将版本号写入网站内的某个文本文件,然后在加载页面时读取该文件。
答案 2 :(得分: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>
只需使用simplexml_load_string
,然后获取revision
代码的entry
属性。
请注意,我不会在每个页面视图上执行此操作:不如人们希望您的应用程序快。
相反,我会在创建存档时获得该修订号,稍后会发送到生产服务器 - 并将其存储在某种配置文件中。
这样,您不需要在生产服务器上使用svn
命令,也不需要在该服务器上进行结帐。
答案 3 :(得分:3)
这适用于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";
答案 4 :(得分:3)
在Lance之后,这是一个命令行单行。
svn log -q --limit 1 http://svnbox/path/to/repo/trunk \
| php -r 'fgets(STDIN); preg_match("/(\d+)/", fgets(STDIN), $m); echo $m[0];'
答案 5 :(得分:2)
我喜欢MediaWiki使用的解决方案,阅读.svn/entities
的内容。检查此问题的第一个答案:Getting the subversion repository number into code
答案 6 :(得分:2)
如果您正在寻找Python实现,请查看pysvn,您可以调用info command获取详细信息,包括当前版本:
entry = info( path )
答案 7 :(得分:1)
我知道这已经很老了,但我想我会用PHP为我的网络应用程序提供这样做:
将其放入应用程序的PHP文件中,并为“Date Revision Author HeadURL Id”设置SVN Keywords属性(文件中的关键字替换)。
$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”(不含引号)。
答案 8 :(得分:0)
你可以直接命令到命令行并运行svn info。请记住,这可能是一个混合的修订版。您也可以运行一个svn,STDOUT的最后一行将为您提供修订号。
或者,您想使用svn API吗?您可能还想查看SubWCRev中的TortoiseSVN代码,该代码用于将文件中的标记替换为WC的当前修订版。