从 SVN 转储中删除空修订的问题

Posted

技术标签:

【中文标题】从 SVN 转储中删除空修订的问题【英文标题】:Problem removing empty revisions from SVN dump 【发布时间】:2019-11-22 12:33:51 【问题描述】:

我正在尝试拆分包含多个项目的旧 SVN 存储库。 我试图转储整个存储库,过滤它,然后加载到一个新的存储库,但由于以前的副本和重命名,svndumpfilter 以无效的复制源路径错误结束,除非我包含更多文件夹:

svnadmin dump OldRepository > OldRepository.dump
svndumpfilter include --drop-empty-revs --renumber-revs "/UnwantedFolder1" "/UnwantedFolder2" "/WantedFolder" < OldRepository.dump > WantedRepository.dump

作为一种解决方法,我在 svnadmin 转储中使用了 exclude:

svnadmin dump OldRepository --exclude "/UnwantedFolder1" --exclude "/UnwantedFolder2" --exclude "/EvenMoreUnwantedFolders" > WantedRepository.dump

我可以将此转储加载到一个新的存储库中,唯一的问题是它充满了空修订。我尝试使用 svndumpfilter 来消除它们,但从输出中看起来它保留了所有这些修订(并将它们重新编号为原始编号)。

svndumpfilter --drop-empty-revs --renumber-revs include "/" < WantedRepository.dump > FilteredWantedRepository.dump

另一件奇怪的事情是,即使我在没有开关的情况下进行过滤,将生成的转储加载到新的存储库中也会出现错误:

svndumpfilter include "/" < WantedRepository.dump > NotReallyFilteredWantedRepository.dump
svnadmin create NotReallyFilteredWantedRepository
svnadmin load NotReallyFilteredWantedRepository < NotReallyFilteredWantedRepository.dump

svnadmin: E140001: Dumpstream data appears to be malformed

我发现两个转储文件之间的唯一区别是 WantedRepository.dump 中有

Revision-number: 1
Prop-content-length: 10
Content-length: 10

PROPS-END

Revision-number: 2
Prop-content-length: 10
Content-length: 10

PROPS-END

在 NotReallyFilteredWantedRepository.dump 中缺少 PROPS-END 行。

Revision-number: 1
Prop-content-length: 10
Content-length: 10


Revision-number: 2
Prop-content-length: 10
Content-length: 10

svndumpfilter 的输出有什么问题? 如何删除空修订?

【问题讨论】:

【参考方案1】:

我做了一些测试,看起来没有简单的方法可以做到这一点,因为 svnadmin dump 没有与 svndumpfilter 相同的选项。选项(--drop-empty-revs 等)在关于 --include 和 --exclude 的原始问题的 cmets 中提到,但它们没有实现:https://issues.apache.org/jira/browse/SVN-4729 我什至不确定 --exclude 选项是否被认为是最终的还是仍在开发中。

只要您没有副本和重命名,svndumpfilter 就可以正常工作。 如果有副本,那么您要么必须将它们包含在 svndumpfilter 中,要么使用 svnadmin dump --exclude,但有一些警告:

    仅包含对排除项的修改的修订将被完全没有属性的空修订替换(与 svndumpfilter 生成的空修订不同)。您可以手动删除它们,但对它们使用 svndumpfilter 只会删除它们的 PROPS-END 行,从而生成格式错误的转储文件。

    包含对排除项的修改的修订将失去其 svn:log 属性,即使它们也包含对包含项的修改。

示例 创建文件夹 B 并将其重命名为 A 后,完整转储包括:

Revision-number: 1
Prop-content-length: 108
Content-length: 108

K 10
svn:author
V 6
654321
K 8
svn:date
V 27
2019-11-25T09:55:46.768984Z
K 7
svn:log
V 8
Folder B
PROPS-END

Node-path: B
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10

PROPS-END


Revision-number: 2
Prop-content-length: 115
Content-length: 115

K 10
svn:author
V 6
654321
K 8
svn:date
V 27
2019-11-25T09:58:38.976139Z
K 7
svn:log
V 14
renamed B to A
PROPS-END

Node-path: A
Node-kind: dir
Node-action: add
Node-copyfrom-rev: 1
Node-copyfrom-path: B


Node-path: B
Node-action: delete

从转储中排除 B (svnadmin dump --exclude "/B" Repository &gt; AOnly.dump) 后,修订版 1 被空修订版替换,修订版 2 失去其 svn:log 属性:

Revision-number: 1
Prop-content-length: 10
Content-length: 10

PROPS-END

Revision-number: 2
Prop-content-length: 83
Content-length: 83

K 10
svn:author
V 6
654321
K 8
svn:date
V 27
2019-11-25T09:58:38.976139Z
PROPS-END

Node-path: A
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10

PROPS-END

【讨论】:

以上是关于从 SVN 转储中删除空修订的问题的主要内容,如果未能解决你的问题,请参考以下文章

当我在存储库中丢失一些修订时,如何转储所有 svn 数据?

svnadmin 加载重新编号修订

如何将缺少的 svn:author 批量添加到存储库或转储中?

svnadmin 转储因其中一个修订版中的错误而停止

svn 迁移但转储存储库的一部分

SVN转储大小混乱