我可以将现有的Subversion存储库移动到新的父存储库(并保留历史记录)吗?

时间:2009-01-26 10:31:49

标签: svn

目前,我为每个项目设置了根级存储库,如下所示:

Project1
Project2
Project3
Project5
Project5

我想重新组织这个,以便不是每个项目的存储库,而是每个逻辑分组只有一个,然后项目只是这些“组存储库”中的文件夹,例如:

WebSites
    Project1
    Project2
DesktopApps
    Project3
Libraries
    Project4
    Project5

在保留现有存储库的历史记录的同时,这是否可行?我环顾四周,但我能找到的就是在同一个存储库中移动文件夹,并将文件夹移出存储库到新的存储库中。

无论如何,这只是个人的事情,所以如果它只是一个直接的'不'那么它不是世界末日 - 但是知道所以我不仅仅是把头撞在墙上会很好:)。 p>

4 个答案:

答案 0 :(得分:25)

您应该能够将其转储,然后将其重新加载到新存储库的子目录中:

  

svnadmin dump http://oldrepo/> mydump

     

svnadmin load --parent-dir my / new / folder   http://newrepo/< mydump

答案 1 :(得分:11)

答案 2 :(得分:1)

您可以使用tailor将修订导入新存储库。它一个接一个地从旧存储库中检出代码并将其提交到新存储库。

这也可用于将一种版本控制系统的历史转换为另一种版本。

裁缝项目文件如下所示:

[DEFAULT]
root-directory = /var/tmp/tailor
verbose = true

[myproject]
source = svn:oldrepo
target = svn:newrepo
start-revision = INITIAL

[svn:oldrepo]
repository = svn://oldhost.example.com/svnroot
module = trunk
subdir = repo-in

[svn:newrepo]
repository = svn://newhost.example.com/some/path
module = trunk
subdir = repo-out

如果此文件被称为settings.cfg,则会通过重新命令将旧存储库重建的/trunk复制到新位置:

tailor --configfile=settings.cfg myproject

目标存储库需要已经存在,并且可能应该有一个空的trunk子目录。

答案 3 :(得分:1)

由于接受的答案是不完整的,并且没有得到纠正,以下是您实际操作的方法。

(1)您的源代码是一个单项目仓库,顶级目录为foo。转到旧服务器并创建转储文件:

[old-server]$ svnadmin dump /path/to/old-repo > foo.dump

(2)您的目标仓库已包含两个项目,顶级目录barbaz,位于http://new-server/svn。现在创建一个额外的foo顶级:

[client]$ svn ls http://new-server/svn/
bar/
baz/
[client]$ svn mkdir -m "Adding new foo project" http://new-server/svn/foo
[client]$ svn ls http://new-server/svn/
bar/
baz/
foo/

(3)在您的新服务器上,仓库位于/path/to/new-repohttp://new-server/svn/映射到的位置)。请注意,上面的svn mkdir实际上并没有在/path/to/new-repo中创建新目录;它只是改变了数据库。转到新服务器和

[new-server]$ svnadmin load /path/to/new-repo --parent-dir foo < foo.dump

完成,完整的历史。您现在可以将foo结帐为:

[client]$ svn co http://new-server/svn/foo foo

如果这是您第一次完成svnadmin,则可能会发现您获得了文件权限错误(txn-current-lock / etc),例如,如果repo归apache,并且您不在apache群组中。最简单的解决方法是将自己添加到apache组。