作为一名软件开发人员,我有一个大型项目,其代码存储在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上的项目编写。。
我不喜欢‘重新发明一个轮子’,除非它是必要的,所以你的帮助是感激的。
发布于 2015-07-12 16:41:27
svn log FILENAME的非XML(低噪音)输出。一些样品中含有(一些因素)头部状态下的玩具回购。
>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
------------------------------------------------------------------------在恢复历史的情况下。对于XML和非-XML日志,您必须执行大致相同数量的Core操作。
>svn log Core -q -v | grep A | grep Core | grep from
A /trunk/Core/core-classic.txt (from /trunk/core.txt:4)(递归地重复“从”侧的每个路径部分)
或者,对于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键中提取源路径,用新提取的路径重复日志记录)
https://stackoverflow.com/questions/31360397
复制相似问题