从 SVN 转储中删除空修订版时出现问题

uba*_*acs 5 svn version-control

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

svnadmin dump OldRepository > OldRepository.dump
svndumpfilter include --drop-empty-revs --renumber-revs "/UnwantedFolder1" "/UnwantedFolder2" "/WantedFolder" < OldRepository.dump > WantedRepository.dump
Run Code Online (Sandbox Code Playgroud)

作为解决方法,我在 svnadmin 转储中使用了排除:

svnadmin dump OldRepository --exclude "/UnwantedFolder1" --exclude "/UnwantedFolder2" --exclude "/EvenMoreUnwantedFolders" > WantedRepository.dump
Run Code Online (Sandbox Code Playgroud)

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

svndumpfilter --drop-empty-revs --renumber-revs include "/" < WantedRepository.dump > FilteredWantedRepository.dump
Run Code Online (Sandbox Code Playgroud)

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

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

svnadmin: E140001: Dumpstream data appears to be malformed
Run Code Online (Sandbox Code Playgroud)

我发现这两个转储文件之间的唯一区别是 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
Run Code Online (Sandbox Code Playgroud)

而在 NotReallyFilteredWantedRepository.dump 中,PROPS-END 行丢失。

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


Revision-number: 2
Prop-content-length: 10
Content-length: 10
Run Code Online (Sandbox Code Playgroud)

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

uba*_*acs 2

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

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

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

  2. 包含排除项目的修改的修订将丢失其 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
Run Code Online (Sandbox Code Playgroud)

从转储 ( svnadmin dump --exclude "/B" Repository > AOnly.dump) 中排除 B 后,修订版 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
Run Code Online (Sandbox Code Playgroud)