2

我已经通过首先克隆一个存储库然后'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)

这是什么意思?

我搜索并阅读 如何应对 git push 上的“拒绝”?

我什至尝试'git push origin HEAD',它给了我同样的错误:

4

3 回答 3

4

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

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

在您推送到的存储库上,如果存在冲突,您将无法立即进行更改。工作树反而会过时;存储库中的内容和工作树中的内容将不同步。为了防止这种情况,Git 拒绝让你推送到非裸仓库。

建议使用裸存储库作为您的“中央”存储库,您可以推入和拉出,为您的工作树使用非裸存储库;你实际工作的地方。由于看起来您已经有一个从中克隆的存储库,因此您需要从中创建一个裸存储库,并将您的更新origin为指向裸存储库而不是非裸存储库。您可以使用git clone --bare path/to/original/repo path/to/bare/repo.git(习惯上命名为 bare repos name.git)创建裸仓库。如果这将在同一台机器上的多个人之间共享,您还应该通过--shared正确设置权限。然后在您的工作副本中,运行git remote set-url origin path/to/bare/repo.git, 和git remote set-url --push origin path/to/bare/repo.git(或者user@host:/path/to/bare/repo.git如果您通过 SSH 访问它)。

于 2012-11-23T21:32:01.397 回答
2

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

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

错误消息会告诉您您需要知道的一切:您可以更改远程存储库中的配置以允许这样做,或者您可以将其渲染为裸露。

于 2012-11-23T21:18:55.987 回答
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

推送当前分支。

于 2012-11-23T21:25:00.777 回答