如何克隆仓库的所有远程分支
普通 git clone 通常获取可见且 refspec 覆盖的分支历史,默认只建立一个本地分支;浅克隆等会限制范围。检出任意远程分支用 git checkout <分支名>。git clone --mirror 镜像可见引用;迁移前须确认目标可被覆盖,LFS 和子模块另行处理。
其实普通 git clone 通常获取服务器可见且 fetch refspec 覆盖的远程分支历史;浅克隆、single-branch、partial clone 和访问权限会限制范围——git branch -r 能看到本地已有的 origin/* 跟踪引用,git checkout 分支名 即可为任一远程分支建本地分支。镜像服务器可见引用可用 git clone --mirror;隐藏引用、LFS 和子模块不在此保证内。
普通克隆后检出其他分支
git clone https://github.com/org/repo.git
cd repo
git branch -r # 查看所有远程分支
git checkout develop # 自动建本地跟踪分支
批量为所有远程分支建本地分支
git for-each-ref --format='%(refname:strip=3) %(symref)' refs/remotes/origin/ |
while read -r branch symbolic; do
[ -n "$symbolic" ] && continue
git show-ref --verify --quiet "refs/heads/$branch" && continue
git branch --track "$branch" "origin/$branch" || exit 1
done
一般没必要这么做——用到哪个检出哪个更符合 Git 的习惯。
完整镜像(迁移仓库用)
git clone --mirror https://github.com/org/repo.git repo.git
# 得到裸仓库(无工作区),含所有分支/tag/引用
# 仅向确认可被完整替换的目标迁移;mirror 会强制更新并删除目标多余引用
cd repo.git
git push --mirror https://gitlab.com/org/repo.git
--mirror vs --bare:mirror 是"完全克隆包括远程跟踪引用",bare 只转换分支结构。仅在确实需要镜像所有可见引用且目标允许覆盖时使用 --mirror;平台隐藏引用、LFS 对象和子模块仓库仍需单独处理。
常见问题(FAQ)
Q:mirror 克隆的仓库能当日常工作目录用吗?
不适合——它是裸仓库没有工作区。日常用普通 clone;mirror 用于迁移和备份。
Q:迁移后旧仓库的 PR、Issues 会跟过去吗?
不会。Git 只管理代码与引用;Issues/PR/Wiki 是平台数据,GitHub→GitLab 这类迁移要用平台自带的导入工具。
Q:只想备份所有分支最简单的做法?
定时任务跑 git clone --mirror(首次)+ git remote update(增量),可维护引用镜像,但远端删除/改写也可能被同步,不等于有历史留存的备份;需另做不可变快照和恢复验证。