2012-07-27 152 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這樣就可以「推到生產」是有備份/協同合作的目的你的「裸」回購,那麼你有一個單獨的回購協議是在部署服務器上安裝並從克隆裸回購。然後在裸露的回購站點上,您可以放置​​一個'後期接收掛鉤',這使得部署回購做到了拉動。

我敢肯定有關於如何做到這一點導遊......我跟着一個自己曾經:)

[混帳推錯誤「\ [遠程拒絕\]高手