1.1、 仓库权限迁移:
目前需要手动拷贝VisualSVN-SvnAuthz.ini文件到对应新仓库下:
注意命令行操作路径。
之前也尝试过直接拷贝整个仓库目录文件,也可以正常迁移,这种方式简单粗暴。
2、账号密码、分组迁移
直接覆盖 Repositories 目录下 htpasswd、groups.conf 两个文件即可。
批量迁移bat脚本:
@echo offif not exist svn-reps.txt (echo svn-reps.txt file not existgoto end
)for /f %%i in (&#39;type svn-reps.txt&#39;) do (echo https://192.168.2.22/svn/%%isvnrdump dump https://192.168.2.22/svn/%%i > %%i.dumpif errorlevel 0 (echo ok1 %%isvnadmin create %%iif errorlevel 0 (svnadmin load %%i <%%i.dumpif errorlevel 0 (echo ok3 %%i) else echo error3 %%i) else echo error2 %%i) else echo error1 %%i
):end
echo Press any key to continue
pause
批量备份VisualSVN-SvnAuthz.ini权限文件bat脚本:
@echo offset copyToDir=C:\Users\Administrator\Desktop\repsqxbakfor /d %%i in (*) do (echo %%imd %copyToDir%\%%i\confcopy %%i\conf\VisualSVN-SvnAuthz.ini %copyToDir%\%%i\conf
):end
echo Press any key to continue
pause
直接把脚本放到Repositories目录下执行即可,执行完之后需要手动删除所有的*.dump 文件。
svn-reps.txt 为老仓库导出的所有仓库名称。
老仓库权限文件备份后,可以直接手动批量覆盖到新仓库。
20200801
客户端SVN仓库地址切换:
svn relocate https://192.168.2.222/svn/PayCode/
仓库uuid不一致问题处理:
服务端重新设置仓库uuid,和老仓库uuid保持一致:
svnlook uuid E:\Repositories\PayCode
svnadmin setuuid E:\Repositories\PayCode a6835852-ec45-0344-aa83-3cc38ed4f3dd
特别注意:
如果服务器上同时安装了SVN客户端TortoiseSVN,环境变量中的命令可能不是服务端VisualSVN Server的,可以使用全路径执行命令或者命令行定位到VisualSVN Server\bin目录下执行命令!
批量备份仓库uuid脚本:
@echo offif not exist svn-reps.txt (echo svn-reps.txt file not existgoto end
)rem 旧仓库目录
set repsPath=E:\Repositories
rem 新仓库目录
set repsNewPath=E:\Repositoriesfor /f %%i in (&#39;type svn-reps.txt&#39;) do ( for /f %%u in (&#39;svnlook uuid %repsPath%\%%i&#39;) do (rem 直接保存设置uuid完整命令!echo svnadmin setuuid %repsNewPath%\%%i %%u >>svn-reps-uuid.txtif errorlevel 0 (echo OK %%i %%u) else (echo ER %%i %%u))
):end
echo Press any key to continue
pause
批量设置uuid脚本(基于上一个uuid备份脚本,备份的就是设置uuid的完整命令):
@echo offif not exist svn-reps-uuid.txt (echo svn-reps-uuid.txt file not existgoto end
)for /f "delims=""" %%i in (&#39;type svn-reps-uuid.txt&#39;) do ( echo %%i%%iif errorlevel 0 (echo OK %%i) else (echo ER %%i)
):end
echo Press any key to continue
pause
20200803
这两天帮公司迁移SVN仓库,好几年的项目代码都在上面,仓库文件夹总大小200G左右。正真迁移的数据量远大于200G,所以要准备好足够大的硬盘。
VisualSVN Server 估计还是好几年前的版本,新版的浏览器客户端比较好看,功能也更多了。
迁移过程还是比较顺利的,按上面写的脚本来就行。迁移过程中,最大的问题还是个别仓库太大,导致远程拉备份dump文件要花费大量时间。后面迁移可能要注意下,优先迁移最近活跃的仓库,有的仓库几年没更新,早一天晚一天迁移影响不大。如果仓库太大,可以考虑按版本迁移,先把最近的版本迁移过来,不影响正常使用。
还有就是可以先拉仓库备份,拉完之后再进行还原操作,如果你的服务器配置很高,还原很快的话那就无所谓了。
仓库太多,服务器带宽够高的话,可以多开几个脚本进程,同时拉多个仓库的备份。
备份的dump文件可能远比实际仓库文件夹大很多!
我在新服务器还原dump时并未出现uuid不一致问题,使用的版本是:VisualSVN-Server-4.2.2-x64.msi,出现uuid不一致可能是因为工具版本问题。
仓库迁移完之后,如果不想立马更换仓库地址,可以在老服务器临时配个nginx,加个反向代理。我这边因为个别仓库太大,迁移了周日一整天,还有三个大仓库没拉好,无奈只能先走代理,迁移完的走新仓库,没迁移好的还走老仓库。
后面单个仓库尽量不能搞太大,否则迁移备份太麻烦!!!
迁移过程中还发现两个神器:spacesniffer 和 wiztree, 可以方便查看文件夹大小分布。
20200804
Hooks未同步。
20211204
svnsync 同步方式也不错!
20220822
node js备份脚本:
const FS = require("fs");const { exec } = require(&#39;child_process&#39;);async function backup() {const repsString = FS.readFileSync("./svn-reps.txt").toString();const reps = repsString.split("\n").map(e => { return {name: e.split(" ")[0],version: e.split(" ")[1]};}).filter(e => e.name && e.version && e.name !== &#39;Name&#39;);for (let index = 0; index ./Repositories/${rep.name}/${rep.version}/${rep.name}.dump --username xxx --password zzz`);} catch (error) {console.log(error);}}
}function exe(cmd) {return new Promise((resolve, reject) => {exec(cmd, (error, stdout, stderr) => {if (error || stderr) {reject({ error, stderr });return;}resolve(stdout);});});
}backup();
svn-reps.txt 文件(所有仓库名称和最新版本号)可用SVN服务端直接导出。
第一次进行全量备份,后面进行增量备份(每次备份记录备份的版本号或版本范围)。
20220901
使用VisualSVN Server Manager直接Backup仓库(*.vsvnbak), Restore仓库(还原),这个方式备份体积和还原速度似乎最佳(备份任务、远程连接,需要购买企业版?申请45天免费许可证)。