我刚刚结束了一个项目,我正在使用商业SVN提供程序来存储源代码。客户最终选择的Web主机包括作为托管包的一部分的存储库,因此,现在项目已经结束,我想将存储库重新定位到他们的Web主机并停止使用商业帐户。
我将如何做到这一点?
答案 0 :(得分:63)
如果要移动存储库并保留历史记录,则可能需要在两台主机上进行文件系统访问。最简单的解决方案是,如果你的后端是FSFS(最新版本的默认设置),那就是制作整个存储库文件夹的文件系统副本。
如果您有Berkley DB后端,如果您不确定后端是什么,或者您是否正在更改SVN版本号,那么您将需要使用svnadmin转储旧存储库并加载它进入你的新存储库。使用svnadmin dump
将为您提供单个文件备份,您可以将其复制到新系统。然后,您可以创建新的(空)存储库并使用svnadmin load
,这将基本上重放所有提交及其元数据(作者,时间戳等)。
您可以在此处阅读有关转储/加载过程的更多信息:
http://svnbook.red-bean.com/en/1.8/svn.reposadmin.maint.html#svn.reposadmin.maint.migrate
此外,如果您执行svnadmin load
,请确保使用--force-uuid
选项,否则人们将无法切换到新存储库。 Subversion使用UUID在内部标识存储库,并且它不允许您将工作副本切换到其他存储库。
如果您没有文件系统访问权限,可能还有其他第三方选项(或者您可以编写一些内容)来帮助您迁移:基本上您必须使用svn日志重播新版本的每个修订版本存储库,然后修复元数据。您需要使用pre-revprop-change和post-revprop-change钩子脚本来执行此操作,这类型假定文件系统访问,因此YMMV。或者,如果您不想保留历史记录,则可以使用工作副本导入新存储库。但希望事实并非如此。
答案 1 :(得分:33)
rsvndump
非常适合我将存储库从svnrepository.com迁移到我控制的Ubuntu服务器。
安装缺少的依赖项(“APR”和Subversion库)
sudo apt-get install apache2-threaded-dev
sudo apt-get install libsvn-dev
安装rsvndump
wget http://prdownloads.sourceforge.net/rsvndump/rsvndump-0.5.5.tar.gz
tar xvfz rsvndump-0.5.5.tar.gz
cd rsvndump-0.5.5
./configure
make
sudo make install
将远程SVN存储库转储到本地文件
rsvndump http://my.svnrepository.com/svn/old_repo > old_repo_dump
创建新存储库并加载本地转储文件
sudo svnadmin create /opt/subversion/my_new_rep
sudo svnadmin load --force-uuid /opt/subversion/my_new_repo < old_repo_dump
答案 2 :(得分:9)
您也可以使用svnsync。这只需要源存储库上的只读访问权限
答案 3 :(得分:6)
摘自我的Blog-Note-to-myself
现在您可以导入转储文件,例如如果您在机器/ subversion版本之间迁移。例如如果我从源存储库创建了一个转储文件并将其加载到新的存储库中,如下所示。
CmdShell> svnadmin dump D:\CoderZone2\svn-repos > ReposDump.dmp
CmdShell> svnadmin load D:\CoderZone\svn-repos < ReposDump.dmp
答案 4 :(得分:5)
这样做的工具是
svnadmin dump
但要使其工作,您需要对存储库进行文件系统访问。一旦你拥有了(并且存储库是FSFS格式),你可以将存储库复制到新的位置(如果它是BDB格式,强烈建议使用转储/加载)。
如果您没有文件系统访问权限,则必须要求您的存储库提供商为您提供转储(并让他们删除他们的存储库 - 并希望他们遵守)
答案 5 :(得分:5)
如果您没有对存储库的文件访问权限,我更喜欢rsvndump(远程Subversion存储库转储)来生成转储文件。
答案 6 :(得分:4)
您还可以使用svnadmin hotcopy
命令:
svnadmin hotcopy OLD_REPOS_PATH NEW_REPOS_PATH
它需要从存储库进行完整备份,包括所有挂钩,配置文件等。
答案 7 :(得分:4)
基本上,有很多方法可以完成任务。这个主题在SVNBook | Migrating Repository Data Elsewhere中有详细介绍,所以我建议你阅读本书的部分。
以下是您的选择的简要说明:
这取决于您的环境,但很有可能您只需将存储库复制到新服务器即可。复制repo后,必须修改存储库钩子脚本,以确保它们按预期工作。
您可以使用svnadmin dump
和svnadmin load
命令生成完全转储,然后将其加载到另一台服务器上的另一个存储库。您需要svnadmin create
一个新的干净存储库来将转储加载到其中。请记住,该方法仅处理存储库历史记录,不会移动钩子脚本和存储库配置文件!同样,您必须具有对原始存储库的读取文件系统访问权限才能将其转储。
自Subversion 1.7以来,svnrdump
工具可用。一般来说,它模仿svnadmin dump
和svnadmin load
功能,但远程操作。您不需要对原始目标存储库和目标存储库具有读/写文件系统访问权限,因为工具可以像Subversion客户端一样远程操作,例如,通过HTTPS协议。因此,您需要具有对原始存储库的读访问权以及对目标存储库的读/写权。
另一种选择是使用svnadmin hotcopy
命令。该命令主要用于备份目的,它创建存储库的完整副本,包括配置和钩子脚本。您可以将hotcopied存储库移动到另一台服务器。
答案 8 :(得分:3)
答案 9 :(得分:3)
我发现了一篇关于如何将svn存储库从托管服务移动到另一个服务器以及如何进行本地备份的文章:
定义存储库的位置:
mkdir ~/repo
MYREPO=/home/me/someplace ## you should use full path here
svnadmin create $MYREPO
创建一个钩子文件并使其可执行:
echo '#!/bin/sh' > $MYREPO/hooks/pre-revprop-change
chmod +x $MYREPO/hooks/pre-revprop-change
现在我们可以开始使用svnsync
导入存储库,这将初始化目标存储库以便从另一个存储库进行同步:
svnsync init file://$MYREPO http://your.svn.repo.here/
最后一步,将所有待定修订版本从初始化的来源转移到目的地:
svnsync sync file://$MYREPO
现在,您在~/repo
目录中有一个本地svn存储库。
来源:
答案 10 :(得分:2)
您可以在 Chapter 5. Repository Administration, Migrating a repository 中找到有关迁移SVN存储库的帮助。
此方法需要访问svnadmin。