如何通过repo子目录过滤SVN日志结果?

时间:2011-07-06 13:51:29

标签: svn

我正在尝试使用SVN日志命令通过一组修订来查找对我的仓库的特定子目录/文件夹中的文件所做的更改。

这是我到目前为止所做的:

我的回购(主干)的网址是:

http://myserver/svn/repos/myproj/trunk

我只想在回购的DB文件夹(或DB文件夹的任何子文件夹)中找到修改/添加的文件:

http://myserver/svn/repos/myproj/trunk/DB

到目前为止,我有这个:

svn log -r 300:351 -q -v --xml http://myserver/svn/repos/myproj/trunk/DB

当我运行它时,我在repo的其他部分,即/ trunk / app文件夹中获取文件。

有没有办法限制结果,还是我必须做一些后期处理?

3 个答案:

答案 0 :(得分:6)

我根据你所描述的内容在这里采取行动。

我怀疑您看到的路径其他而不是您指定的路径,因为这些路径受到与您指定路径的更改在同一修订中提交的操作的影响。

在这种情况下,您需要对XML进行后期处理,以过滤掉您不关心的路径。

示例:执行此命令...

svn log -r 300:351 -q -v --xml http://myserver/svn/repos/myproj/trunk/DB

可能导致输出:

<?xml version="1.0"?>
<log>
<logentry
   revision="351">
<author>razlebe</author>
<date>2010-02-25T14:03:57.912308Z</date>
<paths>
<path
   kind=""
   action="D">/myserver/svn/repos/myproj/trunk/AnotherFolder
</path>
<path
   kind=""
   copyfrom-path="/myserver/svn/repos/myproj/trunk/AnotherFolder"
   copyfrom-rev="350"
   action="A">http://myserver/svn/repos/myproj/trunk/DB/AnotherFolder
</path>
<path
   kind=""
   action="D">http://myserver/svn/repos/myproj/SomethingElse</path>
</paths>
</logentry>
</log>

在此示例中,您看到修订版351的<logentry>元素。该修订版包含3个操作:

  • 删除文件夹/myserver/svn/repos/myproj/trunk/AnotherFolder
  • 添加文件夹http://myserver/svn/repos/myproj/trunk/DB/AnotherFolder
  • 删除文件夹http://myserver/svn/repos/myproj/SomethingElse

因此,XML输出包含<logentry>版本351,因为该版本会影响您指定的URL。但是因为该修订版也影响了其他路径,所以这些路径也在XML中描述。

换句话说,<logentry>描述了整个修订版;而不仅仅是影响您指定的URL的位。

答案 1 :(得分:1)

当您在Subversion中获取特定目录的详细日志,并且修订版也更改了该目录之外的文件时,将列出该文件。

我相信这就是你的情况。也就是说, http://myserver/svn/repos/myproj/trunk/DB 目录中的文件或目录中有一个修订版,它也影响 http://myserver/svn/repos/myproj/trunk/app 中的文件。因此,您的日志文件将显示修订版中更改的两个文件。

Subversion中的一个设计考虑因素是将所有更改保存在一个修订版中。在像Perforce这样的其他版本控制系统中,这将被视为变更集,并且是变更的原子组成部分。换句话说,Subversion中的更改不是文件的单个修订,而是单个修订中所有文件的所有更改。

从某种意义上说,只询问DB目录中的变化将是毫无意义和误导的。那是因为DB的变化也取决于app目录的变化。

正如其他人所建议的那样,您可以过滤 XML 文件的结果。 (如果你这样做,我强烈建议你使用一个程序模块来完成它(比如XML::Simple,如果你使用的是Perl),而不是试图通过正则表达式解析它。

但是,我建议您在继续前进之前考虑这个问题,因为您将破坏Subversion用于跟踪更改的原子结构。你可能会对发生的变化给出错误的概念。例如,如果有人使用您的报告来撤消DB目录中的特定更改,则他们可能还必须在app目录中撤消更改。

答案 2 :(得分:0)

我认为你必须做一些后期处理。我试图在之前获得对根节点的所有更改,并且必须对其进行后期处理。 Linq-Xml使这项工作变得非常简单。