我的任务是提取 subversion(1.6)存储库的子目录并将其放入其自己的新存储库中。
由于多种原因,我想使用 svnsync 将子目录复制到新存储库。我现在想确保这是安全的,因为 SVNBook 说 (颠覆 1.5)
svnsync 对镜像存储库中未作为镜像操作一部分进行的更改非常敏感。为了防止这种情况发生,最好让 svnsync 进程成为唯一允许修改镜像存储库的进程。
和 (颠覆 1.6)
警告
请勿以导致其版本历史与其镜像存储库的版本历史不同的方式修改镜像存储库。该镜像存储库上发生的唯一提交和修订属性修改应由 svnsync 工具执行。
如果您想使用 svnsync 来真正保持镜像为最新,那么我假设这是有效的。
我们的用例是
- svnsync 将存储库 A 的子目录同步到存储库 B
- 将存储库 A 的子目录设为只读(仅用于存档目的)
- 对存储库 B 上的内容进行所有进一步的提交
有人能确认这个用例是可行的吗?
答案1
在这种情况下,我总是倾向于使用 dump->filter->load 方法来完成此类任务,因为这是最干净的路线。(尽管我意识到在大型存储库上这样做非常耗时)。有什么可以阻止你这样做吗?
也就是说,同步后您将获得一个完整、正常运行的存储库,因此它应该可以正常工作。为了彻底清除,请在第一次同步后针对镜像存储库运行以下命令:
svnlook pl -v --revprop -r0 <path to repo root>
您将看到由该命令创建的三个 svn:sync... 属性svnsync init
。我建议在将其设置为可写之前删除它们。我不思考这是绝对必要的,但它可以防止发生意外(例如,在两个存储库各自独立后尝试重新同步。)
我仍然会推动 dump->filter->load 作为正确的路线,但是......(哦,标记旧的子目录,然后从头部删除它)。
答案2
由于我必须对目标存储库中的目录进行一些调整,所以最终我做了以下操作(旧存储库的路径前缀为 /SOME/DIR/,我想将其删除):
- 初始化并同步:
svnsync init [new repo URL] [old repo URL]
svnsync sync [new repo URL]
- 转储新存储库以进行过滤:
svnadmin dump [new repo PATH] >REPO.dump
- 从存储库路径中删除前缀 /SOME/DIR:
svndumptool.py merge -i REPO.dump -s '^SOME\/DIR\/' '' -x SOME -x SOME/DIR -o REPO_filtered.dump
- 重新导入存储库:
mv [new repo PATH] [away]
svnadmin create [new repo PATH]
svnadmin load --force-uuid [new repo PATH] <REPO_filtered.dump