当向裸的Git仓库推送时,出现“receive.denyCurrentBranch”错误

6

我有一个远程的git裸仓库,我已经从一台机器上推送了一个分支,并在另一台机器上拉取了它。

在另一台机器上进行了一些更改,试图将这些更改推回到远程裸仓库时,出现了“receive.denyCurrentBranch”错误。

发生了什么?

这不应该在裸仓库中发生——上面没有检出任何内容。

从第二台机器看到的分支是:

Fix
dev1
dev2
remotes/origin/HEAD -> origin/dev1
remotes/origin/Fix
remotes/origin/dev1
remotes/origin/dev2
remotes/origin/master

'Fix'是两台开发机上当前的分支。

当我最初在第二台机器上拉取该分支时,我执行了以下操作:

git pull
git checkout -b Fix origin/Fix

我对第一个'remotes'行持怀疑态度——似乎HEAD应该指向我的当前分支,但它没有。我觉得我漏掉了什么。
更新1: 我将“Fix”分支合并到dev1分支,然后推送了“dev1”分支,这个方法可以正常工作(反正我本来就要这样做)。
所以,这是一个解决方法,但我认为真正的问题是HEAD没有绑定到当前分支('Fix'),而是绑定到一个不活跃的分支('dev1')。我不确定如何更改远程仓库上的HEAD?

如果我错了,请有人纠正我,但是裸仓库甚至不应该HEAD。那将表明存在工作目录,并且HEAD指向其基于的提交...您确定远程存储库是裸的吗? - Jonathan
非常确定。没有签出的项目,所有的“git”文件都在存储库的顶级目录中。 - rickb
Jonathan,一个裸的Git仓库确实有HEAD,但没有默认的工作区。对于裸仓库,仍然可以存在工作区,但您必须使用环境变量GIT_WORK_TREE或Git选项--work-tree告知Git它的位置,并使用环境变量GIT_DIR或选项--git-dir指定仓库的位置。 - Derek Mahar
有没有可能已经有一个 fix/whatever 分支,在创建 fix 分支时会与 origin 冲突? - eckes
1个回答

1

从 Machine 2,要将本地存储库中的引用上传到远程存储库,您可以在 push 命令中使用显式引用:

git push origin Fix:refs/heads/Fix

接下来,在 Machine 1 中,您应该使用 fetch 命令获取远程引用

git fetch

在分支列表中(git branch -a),您会发现 origin/Fix(或 remotes/origin/Fix),您可以使用 checkout 命令直接浏览远程分支的内容:
git checkout origin/Fix

进行您的更改、提交等操作,然后使用与第二台机器相同的命令将其推送:

git push origin Fix:refs/heads/Fix

要跟踪分支(即创建一个“指向”远程分支的本地分支),请使用带有--track选项的checkout命令:

git checkout --track -b Fix origin/Fix

然后,您可以在本地分支上进行操作,修复并进行推送和拉取,无需其他参数。

git pull
git commit
git push

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接