SVN服务器迁移后“相对路径报错”实为工作副本仍指向旧仓库URL或服务端配置含硬编码路径所致,需通过Relocate更新客户端地址、修正hooks/ReviewBoard/认证配置中的旧路径,并验证UUID一致性与提交功能。

SVN服务器物理迁移后出现“相对路径报错”,本质不是路径本身出错,而是客户端工作副本(Working Copy)仍指向旧仓库位置,或服务端配置未同步更新,导致路径解析失败。这类问题常见于迁移后执行svn update、svn commit或TortoiseSVN重定位时提示“file not found”“not the same repository as”等错误。
确认是否真为“相对路径”问题
SVN本身不依赖绝对路径运行,但以下环节可能隐含路径硬编码:
-
ReviewBoard等第三方工具:若曾上传diff时填了绝对Base Directory(如
C:svnmyproj),迁移后该路径在数据库中仍被保留,导致找不到文件; -
钩子脚本(hooks):pre-commit或post-commit脚本中若写死旧仓库路径(如
svnlook changed E:old epo),执行时会失败; - 客户端缓存的URL:本地.svn/wc.db里记录的是完整仓库URL,IP或路径变更后,客户端拒绝操作,报“is not the same repository as”。
修正客户端工作副本指向
迁移后,所有开发者的本地工作副本都需要更新仓库地址,不能仅靠重新检出(那样会丢失本地修改和历史操作记录):
- 使用TortoiseSVN:右键工作副本根目录 → TortoiseSVN → Relocate → 输入新仓库URL(如
http://new-server/svn/myproj)→ 确认; - 命令行方式(适用于Linux/macOS或无GUI环境):
svn switch --relocate svn://old-ip/repo svn://new-ip/repo /path/to/working-copy
注意:SVN 1.8+已弃用--relocate,应改用svn relocate(需1.9+)或直接svn switch --set-depth exclude配合svn switch; - 若Relocate失败并提示UUID不一致:说明服务端仓库UUID与客户端记录不符。可导出服务端UUID(
svn info --show-item repos-uuid URL),再用SQLite工具打开本地.svn/wc.db,修改REPOSITORY表中的uuid字段,使其匹配服务端值。
清理服务端残留的绝对路径引用
迁移完成后,检查并更新以下位置中可能出现的旧路径:
-
hooks脚本:进入每个仓库的
hooks/目录,用文本编辑器检查pre-commit、post-commit等脚本,将其中类似E:Repositoriesold的路径替换为新路径(如F:SVNmyproj); -
ReviewBoard数据库:若使用ReviewBoard,需修正
diffviewer_diffset.base_dir和diffviewer_filediff.source_file等字段,用SQL语句批量替换旧路径前缀(如UPDATE diffviewer_diffset SET base_dir = REPLACE(base_dir, 'C:\svn\', '');); -
权限与认证配置:检查
authz、passwd、Apache的httpd.conf或VisualSVN Server管理控制台中是否引用了旧磁盘路径或URL,一并更新。
验证与预防建议
完成上述操作后,务必验证关键路径行为是否正常:
- 在干净目录执行
svn checkout新URL,确认能拉取最新代码; - 用已有工作副本执行
svn info,确认URL、UUID、Repository Root均与新服务端一致; - 提交一个测试文件,观察pre-commit钩子是否触发、ReviewBoard能否正确生成diff;
- 今后上传diff时,Base Directory一律填写相对路径(如
trunk/src),避免再次绑定物理位置。

















