我有一个 Subversion 存储库,其中一个目录被移动了一次。我只想将存储库的一部分发送给某人,其中包括此目录。
我相信我已经阅读并理解了手册。
我尝试了什么:
svnadmin dump /home/Subversion-Repository | \ svndumpfilter 包括新名称/新名称/foo/bar/旧名称> something.svn svnadmin 创建 /new/repos # 创建目录 foo/bar 和 new-name svnadmin 加载 /new/repos < something.svn
但它失败了:
<<< 开始新事务,基于原始修订版 5944 svnadmin:找不到文件:事务“5944-4l4”,路径“新名称/myfile” * 编辑路径:new-name/myfile ...
令我惊讶的是,在完整转储中(不通过 svndumpfilter),有一个修订版将文件添加到新位置:
节点路径:新名称 节点类型:dir 节点动作:添加 道具内容长度:10 内容长度:10
但 svndumpfilter 不保留它。因此,在新名称下提到文件的第一个修订版是“Node-action:change”而不是“Node-action:add”,它失败了。为什么?
有一个 Unix shell 脚本可以随意重现该问题。
[我在 Subversion 邮件列表上问了这个问题,但邮件没有分发,可能是被过度热心的垃圾邮件过滤器吃掉了。]
更新:我测试了 Insyte 的建议。svndumpfilter2 和 svndumpfilter3 都失败了。两者甚至都不检查参数,您可以给他们一个不存在的存储库,他们不会抱怨。
使用 svndumpfilter2,修改我的脚本以使用${SVNDUMPFILTER2} ${REPOS} other/new-name/bar foo/old-name/bar > ${DUMP}
:
<<< 开始新交易,基于原始修订版 7 svnadmin:找不到文件:事务“8-8”,路径“其他/新名称/bar/myfile” * 编辑路径:other/new-name/bar/myfile ...
使用 svndumpfilter3,修改我的脚本以使用
${SVNDUMPFILTER3} --untangle=${REPOS} other/new-name/bar
foo/old-name/bar > ${DUMP}
:
<<< 开始新交易,基于原始修订版 7 svnadmin:找不到文件:事务“8-8”,路径“/other/new-name/bar/myfile” * 编辑路径:other/new-name/bar/myfile ...
我相信您遇到了
svndumpfilter: Invalid copy source path
问题的变体。当 svndumpfilter 最初包含的目录/文件之一是从未包含的树的一部分复制(或在您的情况下移动)时,会出现此问题。最初的解决方案是 Simon Tatham 的 svndumpfilter2,但他的 svn 服务器目前似乎已关闭。此处提供了略微修改的版本:http: //www.dehora.net/hg/tools/raw-file/tip/svn/svndumpfilter2
这里的另一个变体:http: //furius.ca/pubcode/pub/conf/bin/svndumpfilter3.html
另一个在这里: http ://www.undersea.com/~nmb/svndumpfilter4
在这里解释svndumpfilter4(来自archive.org - 不幸的是原版不再可访问): http ://replay.waybackmachine.org/20080827213200/http://www.undersea.com/~nburrell/blog/node/81
这些变体足够聪明,可以使用 svnlook 检索必要的源材料,即使它位于树的包含部分之外。
好的,我现在有一个可以在真实存储库上测试的解决方案。这个想法是只转储修订直到(不包括)重命名,然后是它之后的修订(带有
--incremental
选项)。然后,我重新加载第一个转储,在新存储库中重命名,然后重新加载第二个转储。它似乎工作正常。我制作了我的脚本的修改版本,其中显示了详细的步骤。
如果我理解正确,最初的问题是重命名发生在树中比我想要保留的目录更高的级别,因此 svndumpfilter 没有保留。因此,重命名后对文件的操作失败,因为转储中的
change
节点是类型的,并且没有add
新位置的类型节点。你也可以试试dumpsanitizer。它可以处理文件/目录已移动的问题情况,而无需手动进行。我们使用这种方法将旧存储库的一部分设置为新存储库的基线。