【发布时间】:2015-07-11 18:25:36
【问题描述】:
作为一名软件开发人员,我有一个大型项目,其代码存储在 Subversion® 存储库中。多年来,我多次重构代码并将其梳理成由各种组件组成的模块化架构。一个组件已经成熟到它本身确实应该是一个独立项目的程度。
我希望该组件的代码驻留在一个新的、独立的 Subversion® 存储库中(可能会迁移到 git 存储库中)。但是,我还想保留该组件中所有文件的版本历史记录,以便我可以阅读日志和提交消息,这些消息解释了它是如何以及为什么成为当前形式的。
我创建了现有存储库的转储,并希望使用 svndumpfilter 清除转储文件中的所有提交,但可以将其导入新存储库(使用 svnadmin load)。
正如svndumpfilter documentation 倒数第二段所建议的那样,我打算使用svndumpfilter 上的include 选项来列出我希望在新存储库中保留的路径。
引用:
可能在存储库生命周期的某个时刻,您可能已将文件或目录从 svndumpfilter 排除的某个位置复制到它包含的位置。为了使转储数据自给自足,
svndumpfilter仍需要显示新路径的添加——包括由副本创建的任何文件的内容——并且不将该添加表示为来自不存在的源的副本在您过滤的转储数据流中......如果您怀疑您的存储库中有任何此类副本,您可能需要重新考虑您的包含/排除路径集,可能还包括作为麻烦复制操作来源的路径。
这意味着,当我们通过过滤器运行新项目时,为了保留它们的提交历史,我们不仅要include当前版本的项目文件,还要include它们祖先的路径.
问题是:我们如何确定这些祖先的路径?
可以在存储库 url 上运行 svn log 命令。这将返回其提交历史。使用 --verbose 选项可确保我们可以看到受该历史记录中任何给定提交影响的路径。
我们可以忽略文件被修改的情况。我们非常有兴趣跟踪该文件被 svn 添加到存储库时的历史记录。此外,如果该文件是使用 svn-copy(或任何有效的 svn-move)命令添加的,我们也希望追踪该“源文件”的祖先。
信息都在svn log的输出中。
--xml 选项以 xml 格式打印svn log 输出。这使机器更容易理解它。
我需要一些工具或技术来从给定存储库文件上的svn log 命令输出的 xml 流中提取相关的祖先路径数据。
如果对要提取的项目中的每个文件都执行此操作,那么我们可以构建一组路径,这些路径需要包含在运行以过滤转储文件的svndumpfilter 进程中。
这样的工具或解决方案是否已经存在?
如果是这样,如果您能告诉我,我将不胜感激。
如果不存在解决方案,我打算编写一个小命令行界面 (CLI) 程序来解析 XML。 See the project write-up on github.
除非有必要,否则我不喜欢“重新发明轮子”,因此感谢您的帮助。
【问题讨论】:
-
我最近有一个类似的要求,到目前为止我唯一能找到的是subdi.vision/extract,但我没有测试它,因为它很贵。不过可能会帮助其他人。
-
谢谢@ravisorg - subdi.vision/extract 功能正是我所寻找的。我想我有超过 2,000 次修订,所以还必须为高级版本付费。我可能会玩免费版本来测试它。如果是这样,我会回来报告。
标签: svn xml-parsing svndumpfilter