从 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 > 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 转储中删除空修订的问题的主要内容,如果未能解决你的问题,请参考以下文章