协慌网

登录 贡献 社区

Git 推错误 '[远程拒绝] 主 - > 主(分支当前已检出)'

昨天,我发布了一个关于如何将Git存储库从我的一台机器克隆到另一台机器的问题如何从另一台机器 “克隆”?

我现在能够成功地将 Git 存储库从我的源(192.168.1.2)克隆到我的目标(192.168.1.1)。

但是,当我对文件进行编辑, git commit -a -m "test"git push ,我在目的地(192.168.1.1)上收到此错误:

git push                                                
[email protected]'s password: 
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: with what you pushed, and will require 'git reset --hard' to match
error: the work tree to HEAD.
error: 
error: You can set 'receive.denyCurrentBranch' configuration variable to
error: 'ignore' or 'warn' in the remote repository to allow pushing into
error: its current branch; however, this is not recommended unless you
error: arranged to update its work tree to match what you pushed in some
error: other way.
error: 
error: To squelch this message and still keep the default behaviour, set
error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git+ssh://[email protected]/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://[email protected]/media/LINUXDATA/working'

我正在使用两个不同版本的 Git(远程为 1.7,本地机器为 1.5)。这是一个可能的原因吗?

答案

您可以简单地将远程存储库转换为裸存储库(裸存储库中没有工作副本 - 该文件夹仅包含实际的存储库数据)。

在远程存储库文件夹中执行以下命令:

git config --bool core.bare true

然后删除该文件夹中除.git之外的所有文件。然后,您将能够执行git push到远程存储库而不会出现任何错误。

我开始学习Git时,我遇到了同样的错误。其他一些答案显然不适合 Git 的新手!

(我将使用非技术术语来理解这个想法。)无论如何,发生的事情是你有两个存储库,一个是你最初创建的原始版本,另一个是你刚刚创建的工作版。

现在,您在工作存储库中并使用 “主” 分支。但是,您也恰好在原始存储库中 “登录” 到同一个 “主” 分支。既然你已经在原版中 “登录” 了,Git 担心你可能会陷入困境,因为你可能正在研究原版并搞砸了。因此,您需要返回原始存储库并执行 “git checkout someotherbranch”,现在您可以毫无问题地推送。

我希望这有帮助。

错误消息描述了发生的情况。如果检出该分支,更多现代版本的 Git 拒绝通过推送更新分支。

在两个非裸存储库之间工作的最简单方法是

  1. 总是通过拉(或获取和合并)更新存储库,或者,如果必须,

  2. 通过推送到单独的分支(导入分支),然后将该分支合并到远程计算机上的主分支中。

这种限制的原因是推送操作仅在远程 Git 存储库上运行,它无法访问索引和工作树。 因此,如果允许,对已签出分支的推送会将 HEAD 更改为 与远程存储库上的索引和工作树不一致。

这样就很容易意外地提交撤消所有推送更改的更改,并且很难区分尚未提交的任何本地更改以及新HEAD ,索引和工作树之间的差异由推动HEAD引起的。