Git 推送错误 “[[远程拒绝] 主机 -> 主机(当前已签出分支)”)

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

现在,我可以成功地将 Git 存储库从源(192.168.1.2)克隆到目标(192.168.1.1)了。

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

git push                                                
hap@192.168.1.2'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://hap@192.168.1.2/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://hap@192.168.1.2/media/LINUXDATA/working'

我正在使用两种不同的 Git 版本(远程版本为 1.7,本地计算机版本为 1.5)。那可能是原因吗?

答案

git config --bool core.bare true

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

(我将使用非技术性术语来传达想法。)无论如何,正在发生的事情是您有两个存储库,一个是您首先创建的原始存储库,另一个是您刚刚创建的工作库。

现在,您在工作库中,并且正在使用 “master” 分支。但是您也碰巧在原始存储库中 “登录” 到了相同的 “master” 分支。现在,由于您已经 “登录” 了原件,因此 Git 担心您可能会搞砸,因为您可能正在处理原件并弄乱了东西。因此,您需要返回到原始存储库并执行 “git checkout someotherbranch”,现在您可以毫无问题地进行推送了。

我希望这有帮助。

错误消息描述发生了什么。如果该分支被检出,则较新版本的 Git 拒绝通过推送更新该分支。

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

  1. 总是通过拉取(或获取并合并)来更新存储库,或者,如果需要,

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

出现此限制的原因是,推送操作仅在远程 Git 存储库上运行,而无权访问索引和工作树。 因此,如果允许,对检出分支的推动将使 HEAD 更改为 与远程存储库上的索引和工作树不一致。

这将使得意外提交撤消所有推送的更改的更改变得非常容易,并且也很难区分尚未提交的任何本地更改和具有新HEAD的索引,索引和工作树之间的差异是由于推动移动HEAD造成的。

machine1$ cd ..
machine1$ mv repo repo.old
machine1$ git clone --bare repo.old repo
machine2$ git push origin master:master+machine2
machine1$ git merge master+machine2
A ← B
    ↑
[HEAD,branch1]
A ← B ← C
        ↑
    [HEAD,branch1]
A ← B ← X
    ↑   ↑
[HEAD] [branch1]
[HEAD]
        ↓
        C
      ↙
A ← B ← X
        ↑
       [branch1]
[receive]
denyCurrentBranch = warn
[receive]
denyCurrentBranch = false
git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead

cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master

cd ../server
ls
a
b
git checkout --detach
git config receive.denyCurrentBranch ignore
git checkout -f
mkdir myrepo.git
cd myrepo.git
git init --bare
git push origin master:master
machine1:~/proj1> git init
machine2:~> git clone ssh://machine1/~/proj1
machine1:~/proj1> git config --bool core.bare true
machine1:~/proj1> mv .git/ ../proj1.git
machine1:~/proj1> cd ..
machine1:~> rm -rf proj1
machine1:~> git clone proj1.git
machine1:~> cd proj1