2011-07-06 61 views
3

我正在尝试使用SVN日志命令来查找对一组修订中我的回购的特定子目录/文件夹中文件的更改。如何通过repo的子目录过滤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 

当我运行这个时,我在回购的其他部分获得文件,即在/ trunk/app文件夹中。

有没有办法限制结果或我必须做一些后处理?

+0

您正在使用哪个版本的svn?我(至今)无法使用v1.6.12复制此内容 – razlebe

+0

我正在使用SlikSvn:Subversion command-在线客户端,版本1。 [email protected]。 –

+0

我试图复制这个版本的SlikSvn也不成功。除非...生成的XML输出包含一个对于指定范围内的每个修订,其中该提交中的某个操作影响了我在svn log命令中指定的URL下的路径。 NB。每**修订**一个。还会显示该版本提交下受影响的其他文件。那是你所看到的吗?你可以发布你看到的输出示例吗? – razlebe

回答

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> 

在这个例子中,你看到的版本A <logentry>元素351.该修订包括3项行动:

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

因此,XML输出包括版本351,因为该修订影响到您指定的URL <logentry>。但是由于该修订版也影响了其他路径,因此这些路径也在XML中进行了描述。

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

+1

谢谢razlebe!这正是发生的事情。很好的解释。 –

+0

问题在于它仍然告诉我有关在相同提交中提交给其他路径的文件。这是一种痛苦。 – Stephen

0

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

1

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

我相信这是你的情况发生了什么。也就是说,在目录内的文件或目录中存在一个修订,该目录也影响http://myserver/svn/repos/myproj/trunk/app中的文件。因此,您的日志文件将显示在修订中更改的两个文件。

Subversion的设计注意事项之一是将所有更改保留在一个修订版中。在Perforce等其他版本控制系统中,这将被视为变更集,并且是变更的原子组成部分。换句话说,Subversion中的变化不是文件的单个修订版,而是单个修订版中所有文件的所有更改。

从某种意义上说,只询问DB目录中的更改将毫无意义且具有误导性。这是因为DB中的更改也取决于app目录中的更改。

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

但是,我建议你考虑一下因为你将打破Subversion用来跟踪变化的原子结构,你可能会给出一个错误的变化概念,例如,如果有人使用你的报告来退出DB目录中的特定变更,他们可能不得不退出app目录中的更改