推送Git仓库到新远程源时丢失分支,该如何解决?
问题原因
- 你从SVN迁移来的分支默认是远程跟踪分支(格式像
svn/feature/xxx),不是本地分支。git push --all只会推送本地分支,所以只有默认的master本地分支被推去了GitLab。 - 之后本地分支消失,大概率是你添加GitLab作为origin后,执行了
git fetch origin或者误删了原来的SVN远程配置,导致原来的SVN远程跟踪分支被清理,git branch -a就看不到了。
正确推送所有分支的方法
找回SVN远程跟踪分支
先检查你的.git目录里有没有refs/remotes/svn文件夹。如果有,先把SVN远程加回来:git remote add svn <你原来的SVN仓库地址>执行完再跑
git branch -a,应该就能看到之前的SVN分支了。把远程跟踪分支转成本地分支
可以手动逐个转换,也用脚本批量处理:- 手动转换示例(比如分支是
svn/feature/pay):git checkout -b feature/pay svn/feature/pay - 批量转换脚本:
for branch in `git branch -r | grep svn | grep -v master`; do git checkout -b ${branch#svn/} $branch done
转换完成后,用
git branch就能看到所有本地分支。- 手动转换示例(比如分支是
推送所有本地分支到GitLab
确认本地分支都创建好后,执行:git push -u origin --all这次所有本地分支都会被推送到GitLab的origin远程。
本地分支恢复
- 如果.git目录里还保留着
refs/remotes/svn,按上面步骤找回即可,不用重新迁移。 - 如果这个文件夹已经没了,看看有没有迁移时的备份(比如当时压缩的.git文件夹),恢复备份就能找回分支。
- 要是既没备份也没残留文件,那只能重新跑SVN到Git的迁移流程了。
内容的提问来源于stack exchange,提问作者bartoli
相关产品推荐
相关产品推荐

