【问题标题】:Getting 'receive.denyCurrentBranch' error when pushing to bare Git repo推送到裸 Git 存储库时出现“receive.denyCurrentBranch”错误
【发布时间】:2011-04-29 13:49:00
【问题描述】:

有一个远程 git bare repo,我从一台机器上推送了一个分支,然后拉到另一台机器上。

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

发生了什么事?

这不应该发生在裸回购上 - 没有任何检查。

从机器 2 看到的分支是:

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

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

当我最初在机器 2 上拉出那个分支时,我做了:

git pull
git checkout -b Fix origin/Fix

我怀疑第一条“远程”行 - 似乎 HEAD 应该指向我当前的分支,但事实并非如此。觉得我错过了什么,在这里..

更新 1 我将 'Fix' 分支合并到 dev1 分支,然后推送 'dev1' 分支 - 工作正常(反正我正要这样做)。

所以,这是一种解决方法,但我认为真正的问题是 HEAD 没有绑定到当前分支('Fix'),而是绑定到非活动分支('dev1')。我不知道如何在远程 repo 上更改 head?

【问题讨论】:

  • 如果我错了,请有人纠正我,但是裸存储库甚至不应该 HEAD。这表明有一个工作目录,并且 HEAD 指向它所基于的提交......你确定远程仓库是裸露的吗?
  • 相当肯定。没有签出的项目,所有的 'git' 文件都在存储库的顶级目录中。
  • Jonathan,一个裸 Git 存储库确实有一个 HEAD,但没有默认工作区。裸存储库仍然可以存在工作区,但您必须使用环境变量 GIT_WORK_TREE 或 Git 选项 --work-tree 通知 Git 它存在的位置,并使用环境变量 GIT_DIR 或选项 --git-dir 通知存储库的位置。跨度>
  • 是不是已经有一个fix/whatever 分支,而这与在源上创建fix 分支有冲突?

标签: git push git-push git-bare


【解决方案1】:

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

git push origin Fix:refs/heads/Fix

之后,在 Machine 1 中,你应该使用 fetch 命令获取远程 refs

git fetch

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

git checkout origin/Fix

进行更改、提交等...然后使用机器 2 中使用的相同命令推送它:

git push origin Fix:refs/heads/Fix

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

git checkout --track -b Fix origin/Fix

然后,您可以在本地分支上工作修复并在没有其他参数的情况下进行推送和拉取

git pull
git commit
git push

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-07
    • 2013-03-28
    • 2015-10-11
    • 2016-04-07
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多