svn dump - >路径重命名通过windows powershell - >与格式错误的dumpfile标头斗争

时间:2014-05-12 16:05:07

标签: svn powershell windows-7 tortoisesvn dump

标题说明了一切:) 我想要的是从一个项目转储文件夹并将其存储到另一个项目。两个文件夹(src:proj1 / trunk / supplies,dest:extlibs / trunk)都在同一个存储库中。我的问题是,当我加载“普通”转储文件时,保留上一个文件夹的路径,并将在新位置(extlibs / trunk / proj1 / trunk / supplies)重新创建。所以我试图用win7 powershell手动更改路径:

svnrdump dump https://localghost/svn/test_repo/proj1/trunk/supplies |           \ 
% {$_ -replace "Node-path: proj1", "Node-path: extlibs"} |                      \
% {$_ -replace "Node-path: extlibs/trunk/supplies", "Node-path: extlibs/trunk"}|\
Out-File foo.dmp

或者,我也使用了这个命令行:

svnadmin dump <local svn dir> | svndumpfilter include proj1/trunk/supplies | \ 
% {$_ -replace "Node-path: proj1", "Node-path: extlibs"} |                   \
% {$_ -replace "Node-path: extlibs/trunk/supplies","Node-path: extlibs/trunk}|\
Out-File foo.dmp

但是,当我使用svnadmin load或svnrdump load来上传路径修改的转储文件时,我收到“malformed dumpfile header”错误。如果我手动更改路径,我会得到MD5校验和错误。我真的很困惑如何更改powershell的输出以使转储加载工作。我试过了

.. | Out-File -Enc UTF foo.dmp
.. | Out-File -Enc ASCII foo.dmp

有人知道如何更改dumpfile的文件夹路径吗?我的方法是正确的还是有更好的方法来改变回购路径?

我知道有一些工具,但我现在不能使用它们。为了得到更深入的了解,我必须“手工”做到这一点,但似乎我觉得太复杂了。

感谢您的帮助和时间。我希望你们中的一个人知道如何解决这个问题。

2 个答案:

答案 0 :(得分:2)

  • 不得手动更改dump-file
  • 您必须*在转储后使用svndumpfilter
  • 为了改变&#34;挂载点&#34;来自转储的文件夹,您必须才能使用--parent-dir
  • 中的svnadmin load个选项

请阅读此处,SO,主题SVN: how to merge tags from separate projects和(链接回答)Using svndumpfilter to extract a folder in it's own repository blog-post

答案 1 :(得分:1)

@Lazy Badger:实际上是你可以编辑转储文件的SVN redbean书clearly proscribes,这是因为你预期会在没有改变行终止符的情况下小心地这样做。事实上,对于所讨论的示例场景,他们引用编辑Node-path和Node-copyfrom-path来改变转储文件的恢复路径:

  

如果您需要trunk,tags和branches目录   要生活在存储库的根目录中,您可能希望编辑转储文件,调整Node-path和Node-copyfrom-path标头,以便它们不再具有第一个计算/路径组件。

当使用cvs2svn转储CVS repos以导入到不同的SVN结构时,我已多次这样做了。我首先创建dumpfile,然后在将转储文件加载到SVN之前使用sed修改Node-path和Node-copyfrom-path头。工作正常。

这是一个快速的&amp;我使用的脏shell脚本(警告:没有错误检查,所以使用风险自负)。必须从根节点路径开始指定旧路径和新路径。

用法:&lt; script&gt; &LT;转储文件&GT; &LT; oldpath&GT; &LT; NEWPATH&GT;

#!/bin/bash
echo "Replacing path starting with '$2' with '$3' in file $1..."
sed -ri -e 's@^Node-path: '$2'(/|$)@Node-path: '$3'\1@' -e 's@^Node-copyfrom-path: '$2'(/|$)@Node-copyfrom-path: '$3'\1@' $1