具有一个分支的标准subversion布局:
Repo_1
repo_root
|-branches
|-branch_one
|-tags
|-trunk
第二个存储库, Repo_2
repo_root
|-branches
|-tags
|-trunk
|-folder1
我想导出Repo_2/trunk/folder1内容到Repo_1/branches/branch_one/folder1
我正在转储文件夹:svnrdump dump svn://mysvnserver/Repo_2/trunk/folder1 > folder1.dump
svnadmin load Repo_1 --parent-dir branches/branch_one < folder1.dump
得到如下Repo_1结构:
repo_root
|-branches
|-branch_one
|-trunk
|-folder1
|-tags
|-trunk
得到我不需要的主干文件夹。有没有办法插入我的"folder1"直接到"branch_one" ?
仔细完整地重读在SVN Book中过滤存储库历史记录,特别注意警告
您忘记了,转储文件中包含转储节点的所有相对路径,并且--parent-dir
只更改转储节点中提到的起始挂载点,而不是相对位置
您的每个转储文件将创建一个有效的存储库,但将完全保留原始存储库中的路径。这意味着即使您有一个单独用于calc项目的存储库,该存储库仍然有一个名为calc的顶级目录。如果您希望您的主干、标签和分支目录位于存储库的根目录中,您可能希望编辑转储文件,调整
Node-path
和Node-copyfrom-path
头文件,使它们不再具有第一个calc/path组件
根据我自己的经验,我更喜欢总是过滤器转储与svndumpfilter include
,即使转储是用svnrdump创建的,只有一部分的仓库树:它产生更少的(0)错误或svnadmin load
。例如,将远程REPO/trunk/lib
移动到本地存储库(默认存储库树已经存在)的相同路径对我来说意味着
>svnrdump dump URL/trunk/lib > full.dmp
>svndumpfilter include --pattern "*lib*" --drop-empty-revs --renumber-revs < full.dmp > filtered3.dmp
(include --pattern
只是因为普通include lib
产生更差的结果,但它可能是与手有关的唯一问题)
和这个过滤后的转储可以很容易地加载
>svnadmin load Repo --parent-dir / < filtered3.dmp
<<< Started new transaction, based on original revision 1
* adding path : trunk/lib ... done.
* adding path : trunk/lib/lib01.txt ... done.
------- Committed new rev 2 (loaded from original rev 1) >>>
而"dumb"dump
>svnrdump dump URL/trunk/lib > dump.dmp
加载失败
>svnadmin load repo2 < dump.dmp
<<< Started new transaction, based on original revision 1
* adding path : trunk ...svnadmin: E160020: File already exists: filesystem 'bcf62090-928b-9f49-8008-455204e6d81f', transaction '1-1', path '/trunk'