克隆包含bundle变更的Git仓库时,bundle分支未同步怎么办?
问题原因
你在machine-A上通过git fetch把bundle的分支存到了本地远程跟踪分支(路径是refs/remotes/extra/*),但Git默认克隆只会同步仓库里的本地分支(refs/heads/*)。这些远程跟踪分支是machine-A本地独有的引用,不会被默认传递给machine-B的克隆仓库。
解决方法
方法1:把bundle分支转为machine-A的本地分支(推荐,适配镜像场景)
在machine-A的repo目录里,把bundle里的分支逐个转成本地分支:
# 自动遍历所有bundle导入的分支,创建对应本地分支 for branch in $(git for-each-ref --format='%(refname:short)' refs/remotes/extra/); do git checkout -b "$branch" "refs/remotes/extra/$branch" done
完成后,这些分支会被归到refs/heads/下,machine-B再执行git clone时就能自动拿到所有bundle里的分支了。
方法2:允许克隆时获取远程跟踪分支(适合保留原分支结构的场景)
如果不想转成本地分支,想让machine-B也能获取到refs/remotes/extra/*这类引用,可以这么做:
- 在machine-A的repo里,修改配置允许对外暴露所有引用:
git config uploadpack.allowAnyRef true
- 到machine-B上,克隆后手动拉取这些引用:
git clone git@machine-A:/repo cd repo git fetch origin '+refs/remotes/extra/*:refs/remotes/extra/*'
不过这种方式需要machine-B额外执行fetch操作,不如方法1直接。
可选优化:用裸仓库做镜像
如果machine-A专门做镜像仓库,建议用裸仓库(没有工作目录),操作更简洁:
# 在machine-A上重新克隆为裸仓库 git clone --bare git@example.com/repo.git repo-bare cd repo-bare # 直接把bundle的分支导入到裸仓库的本地分支下 git fetch ../extra-upstream.bundle '+refs/heads/*:refs/heads/*' # 之后machine-B克隆这个裸仓库即可 git clone git@machine-A:/repo-bare
内容的提问来源于stack exchange,提问作者skandigraun
相关产品推荐
相关产品推荐

