作为一名软件开发人员,我有一个大型项目,其代码存储在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。
除非有必要,否则我不想“重新发明轮子”,所以我们非常感谢您的帮助。
答案 0 :(得分:1)
svn log FILENAME
一些样本(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
密钥中提取源路径,使用新提取的路径重复记录)