使用git-svn迁移SVN至Git时遭遇update-ref错误128的技术求助
针对你遇到的问题,结合git-svn的工作机制和你的场景,我整理了几个核心排查点和解决步骤:
1. 先确认起始版本r13800是否存在于trunk中
从错误日志里能看到r13800 = ... (refs/remotes/origin/aBranch ),说明这个版本对应的是某个分支的提交,而非trunk。如果trunk在r13800版本时没有任何提交记录,git-svn就无法生成有效的trunk引用,直接导致报错。
你可以用SVN命令验证这一点:
svn log -r 13800 http://<URL>/collectionOfRepositories/repository1/ProjectA/trunk
如果返回“找不到该版本”,那你需要调整起始版本——要么选一个trunk确实存在的更早版本(比如r13000),要么确认trunk在r13800之后才创建,那就从trunk的第一个版本开始克隆。
2. 调整克隆策略:先拉取trunk,再同步分支
如果一定要从r13800开始迁移,可以拆分克隆步骤,优先确保trunk被正确拉取,再同步分支和标签:
# 第一步:单独克隆trunk,从r13800开始 git svn clone -r 13800 --username=myUsername http://<URL>/collectionOfRepositories/repository1/ProjectA/trunk/ --authors-file "authors-transform.txt" projectA-git cd projectA-git # 第二步:初始化分支和标签的远程映射 git svn init http://<URL>/collectionOfRepositories/repository1/ProjectA/ --trunk trunk --tags tags --branches branches # 第三步:拉取分支和标签的历史(从r13800到最新) git svn fetch -r 13800:HEAD
这种方式能避免git-svn先处理分支导致trunk引用缺失的问题。
3. 检查authors-file的格式正确性
虽然错误日志没直接提到作者映射,但如果格式错误(比如缺少某个SVN用户的映射条目),可能间接导致git-svn在提交转换时失败,进而引发引用异常。确保每一行的格式严格为:
svn-username = Git Display Name <git-email@example.com>
4. 清理损坏的仓库,重新开始
之前失败的克隆可能已经生成了不一致的本地引用,建议直接删除projectA-git目录,从头执行调整后的命令,避免残留问题干扰。
关于Windows环境的替代方案
你提到Subgit之前出问题,可以再试一次,Subgit对Windows的支持很完善,步骤如下:
# 初始化Subgit转换配置 subgit configure http://<URL>/collectionOfRepositories/repository1/ProjectA/ projectA-git # 编辑projectA-git/conf/subgit.conf: # 1. 配置authors映射(和git-svn的authors-file格式一致) # 2. 在[svn]区块添加`revision = 13800`指定起始版本 # 执行转换 subgit install projectA-git
如果还是出错,查看projectA-git/subgit/logs/下的日志文件,能找到具体的错误原因(比如权限问题、SVN路径错误等)。
另外,建议升级Windows上的Git和SVN到最新版本(Git 2.30+、SVN 1.14+),旧版本的git-svn存在不少兼容性bug。
内容的提问来源于stack exchange,提问作者Amon

