225

いくつかのマージ競合を解決し、コミットしてから変更をプッシュしようとしたところ、次のエラーが発生しました。

c:\Program Files (x86)\Git\bin\git.exe push --recurse-submodules=check "origin" master:master
Done
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 C:/Development/GIT_Repo/Project
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'C:/Development/GIT_Repo/Project'

このエラーの原因を知っている人はいますか?

4

13 に答える 13

267

理由:非ベア リポジトリにプッシュしようとしています

リポジトリには、ベアと非ベアの 2 種類があります。

ベア リポジトリには作業コピーがなく、それらにプッシュできます。これらは、Github で入手できるリポジトリの種類です。ベアリポジトリを作成したい場合は、次を使用できます

git init --bare

要するに、裸でないリポジトリにプッシュすることはできません(編集: リポジトリの現在チェックアウトされているブランチにプッシュすることはできません。ベア リポジトリでは、チェックアウトされていないため、任意のブランチにプッシュできます。可能ですが、非ベア リポジトリにプッシュすることは一般的ではありません)。 . できることは、他のリポジトリから取得してマージすることです。これはpull request、Github で確認できる がどのように機能するかです。あなたは彼らにあなたから引っ張るように頼みます、そしてあなたは彼らに無理矢理押し込みません。


更新: これを指摘してくれた VonC に感謝します。最新の git バージョン (現在 2.3.0) では、非ベア リポジトリのチェックアウト済みブランチへのプッシュが可能です。それにもかかわらず、安全な操作ではないダーティワーキング ツリーにプッシュすることはできません。

于 2012-06-20T10:47:46.270 に答える
136

私は最初にそのリモートに何もチェックアウトされていないことを確認することでこの問題を解決しました(実際にはチェックアウトされていませんでした)。

$ git config --bool core.bare true

その後、 git push は正常に機能しました。

于 2014-06-20T21:11:44.817 に答える
53

概要

リポジトリの 1 つのチェックアウト済みブランチにプッシュすることはできません。これは、そのリポジトリのユーザーを混乱させ、データと履歴が失われる可能性が高いためです。ただし、同じリポジトリの他のブランチにプッシュすることはできます。

ベア リポジトリにはブランチがチェックアウトされることはないため、いつでもベア リポジトリの任意のブランチにプッシュできます。

問題の解剖

ブランチがチェックアウトされると、コミットは現在のブランチのヘッドを親として新しいコミットを追加し、ブランチのヘッドをその新しいコミットに移動します。

そう

A ← B
    ↑
[HEAD,branch1]

になる

A ← B ← C
        ↑
    [HEAD,branch1]

しかし、誰かがそのブランチにプッシュできた場合、ユーザーは git がデタッチド ヘッドモードと呼ぶものになります。

A ← B ← X
    ↑   ↑
[HEAD] [branch1]

別のブランチのチェックアウトを明示的に要求することなく、ユーザーはもうブランチ 1 にいません。さらに悪いことに、ユーザーはブランチの外にいて、新しいコミットはぶら下がっているだけです:

      [HEAD]
        ↓
        C
      ↙
A ← B ← X
        ↑
       [branch1]

仮説としては、この時点でユーザーが別のブランチをチェックアウトすると、このダングリング コミットは Git のガベージ コレクターにとって公正なゲームになります。

于 2013-02-14T15:35:27.443 に答える
27

私にとっては、次のことがうまくいきました:

git config --global receive.denyCurrentBranch updateInstead

Git を使用して Windows 10 デスクトップと Windows 10 ラップトップの間で同期するために、ドライブ F: のほぼ全体をセットアップしました。上記のコマンドを両方のマシンで実行することになりました。

まず、デスクトップの F ドライブをネットワークで共有しました。次に、次を実行して、ラップトップでクローンを作成できました。

F:
git clone 'file://///DESKTOP-PC/f'

残念ながら、すべてのファイルは直接 F:\ の下ではなく、ラップトップの "F:\f" の下に置かれました。しかし、手動でカット アンド ペーストすることはできました。その後、Git は新しい場所から引き続き動作しました。

次に、ラップトップ上のファイルに変更を加えてコミットし、デスクトップにプッシュして戻そうとしました。上記の git config コマンドを実行するまで、それは機能しませんでした。

これらのコマンドはすべて、両方のマシンで Windows PowerShell 内から実行したことに注意してください。

更新: 場合によっては、変更をプッシュする際にまだ問題がありました。代わりに、最新のコミットをプルしたいコンピューターで次のコマンドを実行して、最終的に変更をプルし始めました。

git pull --all --prune
于 2016-03-12T02:17:10.713 に答える
22

リモート マシンでプッシュしているリポジトリ/ディレクトリに cd して、次のように入力します。

$ git config core.bare true
于 2015-05-20T03:09:24.577 に答える
3

おそらく、リモートリポジトリはプッシュしたいブランチにあります。リモート マシンで別のブランチのチェックアウトを試みることができます。これらのエラーが消えるよりもこれを行い、成功をリモートレポにプッシュしました。github.com の代わりに ssh を使用して独自のサーバーに接続していることに注意してください。

于 2013-06-23T05:25:14.427 に答える