git svn clone卡住或报错“unable to locate remote tracking branch”主因是路径结构不匹配,默认只拉trunk;需确认svn真实路径并指定--stdlayout或--trunk/--branches/--tags参数。

git svn clone 拉取时卡住或报错 Unable to locate remote tracking branch
这是最常见也最容易误判的问题:不是网络或权限问题,而是 git svn clone 默认只拉取 trunk,但你的 SVN 仓库结构可能用了 branches/ 和 tags/ 标准布局,或者根本没用标准路径。Git 不知道该从哪开始找历史,就直接失败。
实操建议:
- 先用
svn info或浏览器访问 SVN 地址,确认真实路径结构(比如是https://svn.example.com/repo/trunk还是https://svn.example.com/repo/project1/trunk) - 明确指定
--stdlayout(仅当路径严格符合trunk/、branches/、tags/三层)或手动用--trunk=xxx --branches=yyy --tags=zzz - 避免直接跑
git svn clone https://svn.example.com/repo—— 大概率失败,必须带路径
迁移后 git log 看不到 SVN 提交人和时间
默认情况下 git svn 只保留作者用户名(如 alice),不带邮箱,也不解析 SVN 的 svn:author 和 svn:date 元数据,导致 Git 日志里作者显示为 unknown,时间全是本地克隆时刻。
实操建议:
- 加参数
--authors-file=authors.txt,提前准备映射文件,格式:alice = Alice Lee <alice></alice> - 务必加上
--no-metadata(否则每个 commit 会多出git-svn-id:行,污染提交信息且影响后续 push) - 时间戳修复不可逆:如果已 clone 完但没加
--no-metadata,不能靠 rebase 补救,得重来
想把已有 SVN 工作目录转成 Git,但不想重新拉全量历史
如果你本地已有 SVN checkout,且只关心最近几次提交,git svn clone 就是杀鸡用牛刀。更轻量的做法是用 git svn init + git svn fetch 增量同步。
实操建议:
- 在 SVN 工作目录里执行
git svn init https://svn.example.com/repo/trunk --no-metadata - 再运行
git svn fetch -r HEAD(只拉最新一次)或git svn fetch -r 1234:HEAD(拉指定范围) - 注意:这种模式下不会自动创建
remotes/trunk分支,fetch 后需手动git checkout -b main remotes/trunk - 不支持直接 push 回 SVN,只适合单向迁移快照
迁完发现 Git 仓库体积比 SVN 还大
SVN 是按需检出,Git 则把所有历史对象(包括二进制大文件的每个版本)全存一份。git svn 迁移时不会自动过滤 target/、bin/、.DS_Store 等垃圾文件,它们会变成永久历史负担。
实操建议:
- 迁移前用
svn log -l 50 --xml | grep -E '<path head> 快速扫一遍近期提交,看有没有频繁提交的大文件</path> - 迁移后立刻用
git filter-repo --invert-paths --path path/to/large.bin清理(别用老旧的filter-branch) - 清理后必须强制推送到新远程:
git push --force --all origin,旧引用不会自动失效
真正麻烦的不是命令怎么写,而是 SVN 里那些没人记得清谁什么时候提交的 .jar、.zip、数据库 dump 文件 —— 它们一旦进历史,就得所有人重新 clone。










