Like this question,但不需要实际查询SVN服务器。这是一个基于Web的项目,所以我想我只是使用存储库作为公共视图(除非有人可以告诉我为什么这是一个坏主意)。我假设这个信息在.svn
文件夹的某个文件中,但是在哪里,以及如何解析它?我想做一些类似于SO的事情,在右下角进行修改。如何以编程方式获取SVN修订版号?
如果您手头上有代码,或者只是在正确的方向上指向一个点,Python或PHP中的代码将得到赞赏。
Like this question,但不需要实际查询SVN服务器。这是一个基于Web的项目,所以我想我只是使用存储库作为公共视图(除非有人可以告诉我为什么这是一个坏主意)。我假设这个信息在.svn
文件夹的某个文件中,但是在哪里,以及如何解析它?我想做一些类似于SO的事情,在右下角进行修改。如何以编程方式获取SVN修订版号?
如果您手头上有代码,或者只是在正确的方向上指向一个点,Python或PHP中的代码将得到赞赏。
颠覆包括svnversion工具正是为了这个目的。工作副本实际上可能有本地修改,或者可能包含多个修订版本。 svnversion
知道如何处理;请参阅链接文档中的示例。
您可以从蟒蛇调用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)
注意它的局限性;如果你是在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
,并获取entry
标签的revision
属性。
请注意,我不会在每个页面视图上执行此操作:速度不如您的应用程序希望的那么快。
取而代之,创建存档时我会得到该修订版本号,稍后将发送到生产服务器 - 并将其存储在某种配置文件中。
这样,您不需要在生产服务器上使用svn
命令,也无需在该服务器上执行结帐。
我希望有一种方法,而不是解析'svn info',但我想这是一个有效的解决方案。可能比解析文件产生更一致的信息......我不知道的'--xml'选项;应该让事情更轻松。 – mpen 2009-09-30 19:14:05
我可能会使用post-commit钩子将版本号写出到网站内某处的文本文件,然后在加载页面时只读该文件。
你可以只掏出来的命令行和运行svn信息。请记住,这可能是一个混合版本。你也可以运行一个svn,最后一行STDOUT会给你修订版本号。
或者,你是否想要使用svn API?您可能还需要查看SubWCRev中的TortoiseSVN代码,该代码用于使用WC的当前修订版替换文件中的标记。
我喜欢MediaWiki使用的解决方案,阅读.svn/entities
的内容。检查这个问题的第一个答案:Getting the subversion repository number into code
如果你正在寻找一个Python实现,退房pysvn,你可以调用info command获得详细信息,包括当前版本:
entry = info(path)
这适用于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文件中,并为“Date Revision Author HeadURL Id”(文件中的关键字替换)设置SVN关键字属性。
$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”(不含引号)。
为什么'shell = True'?见https://docs.python.org/2/library/subprocess.html#frequently-used-arguments – lorenzog 2016-05-11 09:22:31
@lorenzog:这个答案差不多7岁,所以我不记得了。如果你已经证实它的工作原理没有shell = True,那么让我知道,我会编辑它。 – 2016-05-11 12:04:22
它似乎至少对我来说工作正常:http://stackoverflow.com/a/37157630/204634(出于某种原因,我不能@ - 你的尼克..?) – lorenzog 2016-05-11 15:09:11