【问题标题】:How to filter SVN log results by subdirectory of repo?如何通过 repo 的子目录过滤 SVN 日志结果?
【发布时间】:2011-07-06 13:51:29
【问题描述】:

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

这是我目前所拥有的:

我的 repo(主干)的 URL 是:

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

我只想在 repo 的 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 文件夹中获取文件。

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

【问题讨论】:

  • 你用的是哪个版本的svn?我(到目前为止)无法使用 v1.6.12 复制它
  • 我正在使用 SlikSvn:Subversion 命令行客户端,版本 1.6.17-SlikSvn-tag-1.6.17@1130896-WIN32。
  • 我也尝试使用此版本的 SlikSvn 进行复制,但未成功。除非...生成的 XML 输出包含指定范围内的每个修订版的 ,其中该提交中的一个操作影响了我在 svn log 命令中指定的 URL 下的路径。注意。每个 revision 一个 。还显示受该修订的提交影响的其他文件。这就是你所看到的吗?您能否发布一个您所看到的输出示例以进行演示?

标签: svn


【解决方案1】:

根据你的描述,我在这里赌一把。

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

既然如此,您需要对 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 的 &lt;logentry&gt; 元素。该修订版包含 3 个操作:

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

因此,XML 输出包含修订版 351 的 &lt;logentry&gt;,因为该修订版影响了您指定的 URL。但由于该修订也影响了其他路径,因此这些路径也在 XML 中进行了描述。

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

【讨论】:

  • 感谢 razlebe!这正是正在发生的事情。很好的解释。
  • 这里的问题是它仍然告诉我在同一提交中提交到其他路径的文件。这是一种痛苦。
【解决方案2】:

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

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

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

在某种意义上,只询问DB 目录中的更改是没有意义和误导性的。这是因为DB 的更改也取决于app 目录的更改。

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      • 2014-11-10
      • 2015-04-03
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      相关资源
      最近更新 更多