首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析“`svn”的输出,仅列出某个文件历史的前一次投生的路径

解析“`svn”的输出,仅列出某个文件历史的前一次投生的路径
EN

Stack Overflow用户
提问于 2015-07-11 18:25:36
回答 1查看 1.7K关注 0票数 0

作为一名软件开发人员,我有一个大型项目,其代码存储在Subversion存储库中。多年来,我对代码进行了多次重构,并将其调适为由各种组件组成的模块化体系结构。一个组件已经成熟,以至于它本身确实应该是一个独立的项目。

我希望该组件的代码驻留在一个新的独立的Subversion存储库中(可能被迁移到git存储库中)。但是,我也希望保留该组件中所有文件的版本历史,这样我就可以读取日志和提交消息,解释它是如何和为什么以当前形式出现的。

我已经创建了现有存储库的转储,并希望使用svndumpfilter清除除转储文件之外的所有提交,这些提交可以导入到新的存储库中(使用svnadmin load)。

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

引用:

可能在存储库生命周期的某个时候,您可能已经从svndumpfilter正在排除的某个位置复制了一个文件或目录,并将其复制到包含的位置。要使转储数据自给自足,svndumpfilter仍然需要显示新路径的添加--包括副本创建的任何文件的内容--而不是将该添加表示为来自过滤后的转储数据流中不存在的源的副本. ...If您怀疑存储库中有这类副本,您可能需要重新考虑包含/排除的路径集,可能还包括作为麻烦副本操作源的路径。

这意味着,当我们通过过滤器运行新项目时,为了保存他们的提交历史,我们不仅必须在当前版本中include项目文件,而且还必须include他们祖先的路径。

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

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

当文件被修改时,我们可以忽略occassions。我们真正感兴趣的是跟踪历史,直到该文件何时被添加到存储库。此外,如果使用svn-copy (或任何有效的svn)命令添加了该文件,我们也希望跟踪该“源文件”的祖先。

所有的信息都在svn log的输出中。

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

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

如果要提取的项目中的每个文件都这样做,那么我们可以构建一组路径,这些路径需要包含在运行的svndumpfilter进程中,以过滤转储文件。

这样的工具或解决方案是否已经存在?

如果是的话,如果你能告诉我这件事,我会很感激的。

如果不存在解决方案,我打算编写一个小的命令行接口(CLI)程序来解析XML。参见github上的项目编写。

我不喜欢‘重新发明一个轮子’,除非它是必要的,所以你的帮助是感激的。

EN

回答 1

Stack Overflow用户

发布于 2015-07-12 16:41:27

  1. 我不知道在疯狂的网络中有这样的工具(我想每个人都会用自己喜欢的工具“重新发明轮子”)
  2. 我认为,您也可以处理svn log FILENAME的非XML(低噪音)输出。

一些样品中含有(一些因素)头部状态下的玩具回购。

代码语言:javascript
复制
>svn ls -R
API/
API/intefaces.txt
Core/
Core/core-classic.txt
Modules/
Modules/modules-classic.txt

有这么短的历史

代码语言:javascript
复制
>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
------------------------------------------------------------------------

在恢复历史的情况下。对于XML和非-XML日志,您必须执行大致相同数量的Core操作。

代码语言:javascript
复制
>svn log Core -q -v | grep A | grep Core | grep from
   A /trunk/Core/core-classic.txt (from /trunk/core.txt:4)

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

或者,对于XML-log (日志修整的不相关部分)

代码语言:javascript
复制
>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键中提取源路径,用新提取的路径重复日志记录)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31360397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档