1

我想重新排序一个颠覆存储库;为此,我使用 svnadmin dump、svnadmin load、svndumpfilter 和 sed。

比如我想“移动”下面的目录(其实还有很多,但我现在一步一步来):

project1/common/bib -> trunk/pub/common/bib

为此,我对导出的转储文件执行以下命令:

sed -i "s|Node-path: project1/common/bib|Node-path: trunk/pub/common/bib|g" repo.dump
sed -i "s|Node-copyfrom-path: project1/common/bib|Node-copyfrom-path: trunk/pub/common/bib|g" repo.dump

但是,当我将它加载到一个新的/空的存储库中时,我得到:

<<< Neue Transaktion basierend auf Originalrevision 64 gestartet
svnadmin: Datei nicht gefunden: Transaktion »63-1r«, Pfad »trunk/pub/common/bib«
 * Füge Pfad hinzu: trunk/pub/common/bib ...

我不知道为什么这不起作用,因为我愚蠢地替换了每个条目!

4

1 回答 1

1

svnadmin dump确实会生成您的“project1”存储库的完整历史记录。

但是,尽管可能,但更改该历史记录中的文件路径可能很棘手。您的sed命令很好,但它们可能只能完成 98% 的工作。要正确更改历史记录,您需要对更改的历史记录文件进行更多搜索和验证。

这是一个示例,说明如果您只执行这 2 个sed命令,事情会如何被破坏:

假设在修订版 5 中添加并提交了公共目录, svndump将给出:

Node-path: project1/common
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10

PROPS-END

您运行了不完整的sed魔法,但新存储库无法创建trunk/pub/common目录:

Node-path: project1/common # bad! should be: trunk/pub/common !!!
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10

PROPS-END

从这个时间点开始,svn将尝试重新创建您的无效路径,从而给出:

<<< Started new transaction, based on original revision 2
svnadmin: File not found: transaction '1-1', path '/trunk/pub/common'
     * adding path : trunk/pub/common ...

有时这可以工作。但大多数时候它失败了。

解决方案:

就个人而言,我会使用具有良好搜索和替换功能的文本编辑器(例如vim),并替换所有“project1”、“project1/common”和“project1/common/bib”外观。

于 2014-07-05T04:24:34.277 回答