解析`svn log`的输出只列出某个文件历史的先前化身的路径

时间:2015-07-11 18:25:36

标签: svn xml-parsing svndumpfilter

作为一名软件开发人员,我有一个大型项目,其代码存储在Subversion®存储库中。多年来,我多次重构代码并将其转换为由各种组件组成的模块化架构。一个组件已经成熟到它本身应该是一个独立的项目。

我希望该组件的代码驻留在一个新的独立Subversion®存储库中(可能会迁移到git存储库中)。但是,我还想保留该组件中所有文件的版本历史记录,以便我可以读取日志并提交消息,以解释它以当前形式出现的原因和原因。

我创建了一个现有存储库的转储,并希望使用svndumpfilter从转储文件中清除除转换文件之外的所有提交,但可以将其导入新存储库(使用svnadmin load) 。

正如svndumpfilter documentation建议的倒数第二段所述,我打算使用include上的svndumpfilter选项列出我希望在新存储库中保留的路径。

引用:

  

有可能在存储库的生命周期中的某个时刻,您可能已将svndumpfilter排除的某个位置的文件或目录复制到其包含的位置。为了使转储数据自给自足,svndumpfilter仍然需要显示新路径的添加 - 包括由副本创建的任何文件的内容 - 而不是表示添加为来自获胜的源的副本' t存在于过滤后的转储数据流中......

     

...如果您怀疑在存储库中有此类副本,则可能需要重新考虑一组包含/排除的路径,可能还包括作为麻烦复制操作源的路径。

这意味着,当我们通过过滤器运行新项目时,为了保留其提交历史记录,我们不仅必须include当前版本的项目文件,还必须include他们的祖先的道路。

问题是:我们如何确定这些祖先的路径?

可以在存储库URL上运行svn log命令。这将返回其提交历史记录。使用--verbose选项可确保我们可以查看该历史记录中任何给定提交所影响的路径。

我们可以在修改文件时忽略这些错误。我们真的很想跟踪历史记录,直到该文件被svn添加到存储库。此外,如果使用svn-copy(或任何有效的svn-move)命令添加该文件,我们也想跟踪该“源文件”的祖先。

svn log的输出中包含所有信息。

--xml选项以xml格式打印svn log输出。这使机器更容易理解它。

我需要的是一些工具或技术,用于从给定存储库文件上的svn log命令输出的xml流中提取相关的祖先路径数据。

如果要对要提取的项目中的每个文件执行此操作,那么我们可以构建一组路径,这些路径需要包含在运行的svndumpfilter进程中以过滤转储文件。 / p>

此类工具或解决方案是否已存在?

如果是这样,如果你能告诉我,我会很感激。

如果解决方案不存在,我打算编写一个小命令行界面(CLI)程序来解析XML。 See the project write-up on github

除非有必要,否则我不想“重新发明轮子”,所以我们非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

  1. 我不知道野网中的这种工具(我想每个人都用自己喜欢的工具“重新发明轮子”)
  2. 我认为,您还可以处理svn log FILENAME
  3. 的非XML(噪音较小)输出

    一些样本(HEAD-state中有一点玩具回购)

    >svn ls -R
    API/
    API/intefaces.txt
    Core/
    Core/core-classic.txt
    Modules/
    Modules/modules-classic.txt
    

    历史如此短暂

    >svn log -v -q
    ------------------------------------------------------------------------
    r5 | Badger | 2015-07-12 20:58:23 +0500 (Вс, 12 июл 2015)
    Changed paths:
       A /trunk/API/intefaces.txt (from /trunk/inteface.txt:4)
       A /trunk/Core/core-classic.txt (from /trunk/core.txt:4)
       A /trunk/Modules/modules-classic.txt (from /trunk/modules.txt:4)
       D /trunk/core.txt
       D /trunk/inteface.txt
       D /trunk/modules.txt
    ------------------------------------------------------------------------
    r4 | Badger | 2015-07-12 20:55:29 +0500 (Вс, 12 июл 2015)
    Changed paths:
       A /trunk/API
       A /trunk/Core
       A /trunk/Modules
    ------------------------------------------------------------------------
    r3 | Badger | 2015-07-12 20:53:36 +0500 (Вс, 12 июл 2015)
    Changed paths:
       D /trunk/a.txt
       D /trunk/b.txt
       D /trunk/c.txt
       A /trunk/core.txt (from /trunk/a.txt:2)
       A /trunk/inteface.txt (from /trunk/c.txt:2)
       A /trunk/modules.txt (from /trunk/b.txt:2)
    ------------------------------------------------------------------------
    r2 | Badger | 2015-07-12 20:50:40 +0500 (Вс, 12 июл 2015)
    Changed paths:
       A /trunk/a.txt
       A /trunk/b.txt
       A /trunk/c.txt
    ------------------------------------------------------------------------
    r1 | Badger | 2015-07-12 20:47:11 +0500 (Вс, 12 июл 2015)
    Changed paths:
       A /branches
       A /tags
       A /trunk
    ------------------------------------------------------------------------
    

    如果恢复历史,f.e。 Core dir用于XML和非XML日志,您必须执行大约相同数量的操作

    >svn log Core -q -v | grep A | grep Core | grep from
       A /trunk/Core/core-classic.txt (from /trunk/core.txt:4)
    

    (递归地重复“从”侧的每个PATH部分)

    或者,对于XML-log(日志修剪的无关部分)

    >svn log Core -q -v --xml
    ...
    <paths>
    ...
    <path
       text-mods="false"
       kind="file"
       copyfrom-path="/trunk/core.txt"
       copyfrom-rev="4"
       action="A"
       prop-mods="false">/trunk/Core/core-classic.txt</path>
    ...
    

    (解析感兴趣路径的每个路径节点,从copyfrom-path密钥中提取源路径,使用新提取的路径重复记录)