如何让origin/HEAD在Git部分拉取配置下正常工作?
问题
常规git clone后,.git/config的remote配置如下:
[remote "origin"] url = git@github.com:orgname/reponame.git fetch = +refs/heads/*:refs/remotes/origin/*
此时执行git show origin/HEAD可正常运行。
但如果仅需拉取prod分支和以jakub/为前缀的分支,手动配置.git/config为:
[remote "origin"] url = git@github.com:orgname/reponame.git fetch = +refs/heads/prod:refs/remotes/origin/prod fetch = +refs/heads/jakub/*:refs/remotes/origin/jakub/*
执行git fetch后,运行git show origin/HEAD会报错:
fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.
尝试添加以下fetch规则时:
fetch = +refs/heads/HEAD:refs/remotes/origin/HEAD
执行git fetch会报错:
fatal: couldn't find remote ref refs/heads/HEAD
解决方案
origin/HEAD是本地对远程仓库默认分支的引用,它对应的远程引用是refs/HEAD(而非你之前配置的refs/heads/HEAD),同时还有两种更可靠的处理方式:
方法1:正确配置fetch规则获取远程HEAD
修改.git/config的remote配置,添加针对远程refs/HEAD的fetch规则:
[remote "origin"] url = git@github.com:orgname/reponame.git fetch = +refs/heads/prod:refs/remotes/origin/prod fetch = +refs/heads/jakub/*:refs/remotes/origin/jakub/* fetch = +refs/HEAD:refs/remotes/origin/HEAD
之后执行git fetch,即可获取origin/HEAD引用,此时git show origin/HEAD就能正常运行。
方法2:手动设置或自动探测origin/HEAD
如果方法1无效(部分托管平台可能限制直接获取refs/HEAD),可以直接手动指定origin/HEAD指向本地已拉取的默认分支:
git remote set-head origin prod
或者让Git自动探测远程仓库的默认分支并设置:
git remote set-head origin --auto
执行完上述命令后,无需修改fetch规则,git show origin/HEAD也能正常工作。
注意:第二种方法不需要额外的fetch规则,因为它直接在本地创建了origin/HEAD引用,关联到已拉取的远程分支。
内容的提问来源于stack exchange,提问作者jakub.g
相关产品推荐
相关产品推荐

