2012-07-27 148 views
3

我有一个远程和本地git存储库。
本地存储库是来自远程的克隆。
当我修改我的本地存储库并提交到主分支。
然后我运行“git push”到远程存储库。
但它失败并输出以下消息。git推送到远程主分支

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 t 
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing int 
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 som 
remote: error: other way. 
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, se 
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'. 

我“git checkout -b current”远程仓库中的另一个分支。
在我的本地存储库中,我运行“git push”,然后成功。
但本地修改只推送到远程主分支。
然后,我应该在远程存储库中运行“git merge master”来进行更改。

我是新手混帐。
我做错了吗?

+0

可能重复 - >主(分支当前检出)'](http://stackoverflow.com/questions/2816369/git-push-error-remote-rejected-master-master-branch-is-currently-checked) – eckes 2012-07-27 05:37:28

+0

与http:// stackoverflow相同。 com/questions/11395398/git-push-failing-refusing-to-update-checked-out-branch,http://stackoverflow.com/questions/11117823/git-push-error-refusing-to-update-checked- out-branch,http://stackoverflow.com/questions/8985782/git-push-fails-refusing-to-update-checked-out-branch-refs-heads-master – eckes 2012-07-27 05:37:59

回答

7

远程存储库不是裸存储库,并且检出了主服务器。而且,默认情况下,git不允许您推送到非裸回购的检出分支。

理想情况下,您推送的远程回购应设置为裸回购(git init --bare)。

+0

我现有的回购可以设置为裸回购( git init --bare)? – Magic 2012-07-27 09:22:39

+0

我不这么认为,但如果它是一个基于Linux的主机,并且你的repo命名为'foo',那么它就像'mv foo foo2','mkdir foo','cd foo','' git init --bare','git remote add origin ./../ foo2','git pull' – 2012-08-04 11:51:21

1

当我是新来的GitHub我的导师给了我这个经验法则,遵循:

让本地修改你的代码。当它的时间来提交,请执行以下操作:

  1. git pull
  2. 如果在不同的文件中的任何冲突(远程回购的内部参考报头同步到你的本地仓库很重要的)合并他们仔细通过选择您的副本或远程副本或通过在Kdiff中打开这两个文件的组合。一旦你解决了所有的冲突推动合并。
  3. 执行第2步之后,请执行git push以保存您对首先要提交的代码进行的本地更改。

颠覆可能是一个痛苦,但它是保持同步非常重要。 这些规则集帮助我保持使用github的子版本。 希望这有助于。

+0

我认为这对OP没有帮助,因为你在谈论一般的slipslop而不是解决他的问题。 – eckes 2012-07-27 05:41:38

+1

关于你的经验法则:我认为这是错误的。什么时候提交,提交。期。没有其他的。当需要回到另一个回购的时候,你必须做一些事情,比如'fetch'和'rebase','pull'或类似的东西。然后解决冲突。然后“推”。并在第3步中,您的本地**提交**被发送到远程回购。 SVN不是一个痛苦,它是**。 – eckes 2012-07-27 05:44:36

2

manojlds的回答是正确的,但它可能有助于了解您的远程回购的目的是什么。

  • 如果远程回购仅用于备份/协作的目的 - >您有正确的想法,只需将远程回购替换为“裸”,然后从那里开始。
  • 如果远程回购是生产服务器,那么你做错了事情 - >你应该有不同的配置。

一个好的confiruation这样就可以“推到生产”是有备份/协同合作的目的你的“裸”回购,那么你有一个单独的回购协议是在部署服务器上安装并从克隆裸回购。然后在裸露的回购站点上,您可以放置​​一个'后期接收挂钩',这使得部署回购做到了拉动。

我敢肯定有关于如何做到这一点导游......我跟着一个自己曾经:)

[混帐推错误“\ [远程拒绝\]高手