如何在git push被拒绝时修复错误

时间:2012-11-23 21:14:06

标签: git

我已经通过首先克隆存储库然后'git commit'来启动git但是当我执行'git push'时 我收到了这个错误:但它说'拒绝更新结帐分支'?

$ git push
Counting objects: 17, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (13/13), done.
Writing objects: 100% (13/13), 2.72 KiB, done.
Total 13 (delta 5), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To ssh://michael@16.336.22.38/home/michae/scripts
 ! [remote rejected] master -> master (branch is currently checked out)
这是什么意思?

我搜索并阅读 How to cope with "rejected" on git push?

我甚至尝试'git push origin HEAD'给我同样的错误:

3 个答案:

答案 0 :(得分:4)

有两种类型的Git存储库:裸存储和非裸存储。裸存储库只包含提交,分支,标记等;非裸存储库还包含当前工作副本。如果您查看存储库,可以判断它是否存在。如果您有一个包含项目中文件的目录,以及一个.git目录,那么这是一个非裸存储库; .git目录之外的那些文件是当前的工作副本。如果您只拥有存储库的内容,例如refsobjects等,则这是一个裸存储库。它没有工作副本。

您只能推送到裸存储库(除非您覆盖默认配置)。您可以从非裸存储库中提取,然后进入非裸存储库,但不能推入存储库。这是为了防止更新工作副本时出现问题。工作副本是您当前状态的副本;您可能已编辑过文件,等等。当您进入存储库时,最新的更改将签入到您的工作副本中;如果您有一些未签入的本地更改,它们将与您从中提取的存储库中的更改合并,或者结帐被拒绝,您需要修复本地副本才能检出新的变化。

在您要推送的存储库中,如果发生冲突,您无法立即进行更改。工作树将过时;回购中的内容以及工作树中的内容将不同步。为了防止这种情况,Git拒绝让你进入非裸仓库。

建议使用裸仓库作为您的“中央”仓库,您可以推送和撤销,为您的工作树使用非裸仓库;你实际上在哪里工作。由于看起来你已经拥有了一个克隆的repo,你需要从中创建一个裸仓库,并更新你的origin以指向裸仓库而不是非裸仓库。您可以使用git clone --bare path/to/original/repo path/to/bare/repo.git创建裸仓库(通常命名为裸仓[{1}})。如果这将在同一台计算机上的多个人之间共享,您还应该通过name.git正确设置权限。然后在您的工作副本中,运行--sharedgit remote set-url origin path/to/bare/repo.git(如果您通过SSH访问它,则运行git remote set-url --push origin path/to/bare/repo.git。)

答案 1 :(得分:2)

目标上的存储库不是“裸”。也就是说,它已检出文件,而不仅仅是.git数据库。

惯例是使用裸“存储库”作为推送的目标。

错误消息告诉您需要知道的一切:您可以更改远程仓库中的配置以允许此操作,或者您可以将其裸露。

答案 2 :(得分:1)

也许您应该将遥控器转换为没有工作副本的裸仓库。

ssh user@remote
cd /path/containing/repo
git clone --bare repo/ repo.git

现在,在您的工作回购中,编辑.git / config以更新远程的URL。在其末尾添加.git

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = user@remote:/path/to/repo.git

然后运行

git push origin HEAD

推送当前分支。