Git推送错误:“[remote rejected] master -> master(分支当前被检出)”

1056

昨天我在stackoverflow上发布了一个问题,询问如何从一台计算机克隆Git仓库到另一台计算机,如何从另一台机器上执行'git clone'命令?

现在我成功地从源(192.168.1.2)克隆了一个Git仓库到目标(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在本地机器上)。这可能是一个原因吗?


5
有没有老手能够更改接受答案为https://dev59.com/LXE85IYBdhLWcg3wXCMv#9283833并将帖子移到存档或其他地方?或者更改所有权或其他什么? - Jacek Krysztofik
13
现在,使用Git 2.3.0(2015年2月)和“git config receive.denyCurrentBranch=updateInstead”,您实际上已经拥有了一种安全地推送到非裸仓库的方法。 - VonC
这是@stigi提到的书的新链接: https://git-scm.com/book/en/v1/Git-on-the-Server - Abdelilah El Aissaoui
可能是一个重复问题,参考这篇文章:当向远程存储库推送更改时,什么是Git警告消息? - Trevor Boyd Smith
但我不明白为什么以及它是如何工作的?它能够运行,是的,但仅此而已。 - Tilak Madichetti
显示剩余2条评论
33个回答

1

最好的方法是:

mkdir ..../remote
cd ..../remote
git clone --bare .../currentrepo/

这将克隆存储库,但不会在“.../remote”中创建任何工作副本。如果您查看远程,则会看到一个名为“currentrepo.git”的目录被创建,这可能是您想要的。

然后从您的本地Git存储库开始:

git remote add remoterepo ..../remote/currentrepo.git

在您进行更改后,您可以:

git push remoterepo master

1
我在Heroku上的部署git仓库遇到了问题。
我不知道为什么Heroku在他们的端上有一个非裸仓库,但是作为一种解决方法,我能够重置远程仓库并重新上传。
你不应该将Heroku的仓库副本用作协作的唯一git仓库,但以防万一,我要明确地说:除非你确定已经在其他安全位置完整地存储了仓库的副本,请不要这样做。重置将删除仓库内容。 要重置:
  1. 如果您尚未安装Heroku工具包(其中包含命令行客户端),请安装Heroku toolbelt
  2. 如果您尚未安装heroku-repo plugin,请安装。

    heroku plugins:install https://github.com/heroku/heroku-repo.git
    
  3. 进行重置操作,删除存储库并创建一个新的空存储库。

    heroku repo:reset
    
  4. 像往常一样将内容推送到您的Heroku远程仓库;它将重新上传所有内容。


您可能需要安装Heroku仓库工具才能使其正常工作。请执行 heroku plugins:install https://github.com/heroku/heroku-repo.git - Noah

1
我相信大多数查看此问题的人都会在前两个庞大的答案处停止,但我仍然想提供我的解决方案。 当遇到所描述的错误时,我使用了Eclipse + EGit web项目设置。帮助我的是简单地使用GitHub应用程序,它似乎神奇地解决了这个问题。虽然EGit总是拒绝推送,但GitHub桌面应用程序只是耸了耸肩膀并推送了我的更改。也许它更优雅地处理了多登录情况。

1

我不得不在一个已经存在的裸仓库中重新运行git --init,这样就在裸仓库树中创建了一个.git目录 - 在输入git status后我意识到了这一点。我删除了它,然后一切都恢复正常了 :)

(所有这些答案都很好,但在我的情况下,它是完全不同的(据我所见),如所描述的。)


1

我发现一篇可能对其他人有用的文章是5分钟学会Git

我有一个在Git版本控制下的Xcode项目,我想将其推送到我在数据中心中拥有的Virtual Distributed Ethernet(VDE)上。VDE运行Centos 5。

我阅读的关于Git的所有文章都没有谈到裸仓库。这听起来很简单,直到我尝试从SVN背景开始的时候,我认为应该很容易。

这里建议将远程存储库设置为裸仓库工作。对于我的要求更好的是,将Xcode项目克隆到projectname.git,将其复制到远程服务器;然后推送就像魔术一样工作了。下一步将是让Xcode推送而不会出现有关提交的错误,但目前我可以在终端上完成它。

所以:

cd /tmp (or another other directory on your system)<br/>
git clone --bare /xcode-project-directory projectname.git<br/>
scp -r projectname.git sshusername@remotehost.com:repos/<br/>

在你已经在Xcode中提交代码后,将更改推送到你的Xcode项目:

cd /xcode-project-directory<br/>
git push sshusername@remotehost.com:repos/projectname.git<br/>

我相信有更加流畅和精致的方法来完成上述任务,但至少这个方法是可行的。以下是一些澄清说明:

/xcode-project-directory 是存储你的 Xcode 项目的目录。它可能是 /Users/Your_Name/Documents/Project_Name

projectname 就是项目的名称,但它可以是任何你想要的名称。Git 不在意,但你会在意。

要使用 scp,你需要在远程服务器上拥有一个允许 SSH 访问的用户帐户。任何运行自己服务器的人都会有这个。如果你正在使用共享主机或类似服务,则可能会遇到麻烦。

remotehost.com 是您远程主机的名称。您也可以使用其 IP 地址。只是为了更清楚,我在远程主机上使用 SSH 密钥使用 Gitosis,因此在推送时不需要提示输入密码。文章 Hosting Git Repositories, the Easy (and Secure) Way 将告诉您如何设置所有这些。


你的链接已经失效了:https://classic.scottr.org/presentations/git-in-5-minutes/。 - Nufosmatic

1

如果您正在使用SSH密钥连接到github,请确保您的SSH密钥仍然在您的个人资料设置下。由于某种原因,我的密钥被清除了,我无法推送到我的主分支。我所做的就是再次将我的SSH密钥添加到settings/SSH keys

enter image description here

查看您现有密钥的命令:cat ~/.ssh/id_rsa.pub


1
一旦您创建了空的(裸)仓库,就需要更改远程服务器上的配置文件。
root@development:/home/git/repository/my-project# cat config 

那里你会看到

[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true

你需要将bare设置为false或true,我已删除logallrefupdates = true(不确定其用途!)

[core]
repositoryformatversion = 0
filemode = true
bare = true

你可以测试以下内容。
$ git remote show origin
* remote origin
Fetch URL: my-portal@development:/home/XYZ/repository/XYZ
Push  URL: my-portal@development:/home/XYZ/repository/XYZ
HEAD branch: (unknown)

如果你无法进行PUSH操作,此时HEAD分支将显示为(未知)。因此,如果HEAD分支是未知的,你应该将bare更改为true,在推送成功后可以重新使用。

git remote show origin

你会看到。
 HEAD branch: master

0

对我来说,可行的解决方案是:

在远程端:

git checkout -b some_tmp_name

在本地:

git push

在远程端:

git checkout master
git branch -d some_tmp_name

但这不是真正的解决方案,只是一种权宜之计。


如果您没有中央存储库,这是一个有效的解决方案。 - Rick

0

如果有人发现它有用的话,我来说一下。对我来说,这是一个git服务器权限问题。我从头开始检查了项目,并推送了一个简单的文件,然后我得到了“Push rejected: Push to origin/master was rejected”。


0

让我来发表一下我的意见,因为最受欢迎的答案 https://dev59.com/LXE85IYBdhLWcg3wXCMv#3251126 建议将远程 repw 转换为裸仓库,但如果这不是我想要的呢?

最终,我必须在远程机器上拥有相同的代码,而不仅仅是一些在 .git 里徘徊的字节块。

第二高票(截至本文撰写时)的解决方案 https://dev59.com/LXE85IYBdhLWcg3wXCMv#2933656 可以解决问题,但在测试之后,我不得不不断在远程机器上切换分支,以便从本地机器推送我想要的分支。

以下方法对我奏效:

对我有效的另一个解决方案并不属于我,功劳归给用户 @kxr,他在第一个解决方案中留言了。

在远程机器上,您必须在仓库目录中执行此命令。

git config receive.denyCurrentBranch updateInstead

之后你就完成了!

显然,这种解决方案可能存在一些缺点,但对于简单的将本地机器代码与远程仓库同步的任务来说,它可能足够好。
如果有人能在评论中解释为什么在Github上创建一个全新的仓库,将你的本地文件夹链接到它,并开始执行“git push origin master”而不出现错误,我会很感激。
但是尝试在远程服务器上使用相同的方法进行操作,则会报错:
! [remote rejected] master -> master (branch is currently checked out)

因为在 Github 上,它是一个裸仓库,没有工作树。 - hl037_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接