如何在pygit2中克隆master后切换分支避免detached HEAD
问题原因
你当前代码触发 detached HEAD 的核心原因是:你直接 checkout 了 origin/[分支名] 对应的远程追踪引用,这类引用属于只读的远程分支镜像,不是本地可编辑的普通分支,Git 对这类引用执行 checkout 操作时默认就会进入 detached HEAD 状态。
另外你提供的测试代码存在语法错误:repo.branches["origin/{0}".format(branch)) 末尾多了一个多余的右括号。
修复方案
- 先基于远程追踪分支创建对应的本地分支,同时绑定上游关联
- 再 checkout 新创建的本地分支即可
修正后代码
repo = pygit2.clone_repository(url, dir, bare=False, checkout_branch="master", callbacks=RemoteCallbacks()) # 获取目标远程分支引用 remote_branch = repo.branches[f"origin/{branch}"] # 创建同名本地分支 local_branch = repo.branches.create(branch, repo.get(remote_branch.target)) # 绑定本地分支上游为对应远程分支 local_branch.upstream = remote_branch # 切换到本地分支,不会进入detached HEAD状态 repo.checkout(local_branch)
内容的提问来源于stack exchange,提问作者Eric Van Bezooijen
相关产品推荐
相关产品推荐

