web-dev-qa-db-ja.com

Gitプッシュエラー:チェックアウトされたブランチの更新を拒否

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

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'

誰もがこのエラーの原因を知っていますか?

166
Funky

リポジトリには2つのタイプがあります。 bareおよびnon-bare

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

git init --bare

したがって、要するに、非ベアリポジトリにプッシュすることはできません (編集:さて、リポジトリの現在チェックアウトされているブランチにプッシュすることはできません。裸のリポジトリでは、何もチェックアウトされていないため、任意のブランチにプッシュすることができます。 。できることは、他のリポジトリから取得してマージすることです。これが、Githubで見ることができるpull requestの仕組みです。あなたは彼らにあなたから引くように頼みます、そしてあなたは彼らに無理やり押し込まないでください。


Update:これを指摘してくれたVonCに感謝します。最新のgitバージョン(現在2.3.0)では、 チェックアウトされたブランチにプッシュしています裸でないリポジトリの可能性 。それでも、dirty作業ツリーにプッシュすることはできません。これは、とにかく安全な操作ではありません。

197
Shahbaz

この問題を解決するには、まずそのリモートに何もチェックアウトされていないことを確認し(実際には想定されていませんでした)、次に次のようにして公開しました:

$ git config --bool core.bare true

その後、Git Pushは正常に機能しました。

96
Sasha Pachev

概要

リポジトリのチェックアウトされたブランチにプッシュすることはできません。なぜなら、おそらくリポジトリがデータと履歴の損失で終わる方法でそのリポジトリのユーザーを混乱させるからです。ただし、同じリポジトリの他のブランチにプッシュすることはできます。

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

問題の剖検

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

そう

A ← B
    ↑
[HEAD,branch1]

になる

A ← B ← C
        ↑
    [HEAD,branch1]

しかし、誰かがそのブランチにプッシュすることができたら、ユーザーはgitが呼び出すものになりますdetached headモード:

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

これで、ユーザーは別のブランチをチェックアウトするように明示的に要求されることなく、branch1にはもういません。さらに悪いことに、ユーザーはブランチ外になり、新しいコミットはダングリングになります。

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

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

39
Nowhere man

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

$ git config core.bare true
19
Ricky

私にとっては、次のトリックでした:

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

14
Stephen G Tuggy

既に既存のリポジトリがあるため、実行中

git config --bool core.bare true

リモートリポジトリで十分です

core.bareドキュメントから

True(bare = true)の場合、リポジトリは作業ディレクトリが関連付けられていない状態であると見なされます。この場合、git-addやgit-mergeなど、作業ディレクトリを必要とする多くのコマンドが無効になります(ただし、プッシュすることはできます)。

この設定は、リポジトリの作成時にgit-cloneまたはgit-initによって自動的に推測されます。デフォルトでは、「/。git」で終わるリポジトリはむき出しではないと想定されます(bare = false)。他のすべてのリポジトリはむき出しであると想定されます(bare = true)。

12
Johnny

TLDR

  1. もう一度プルしてプッシュ:git pull &&& git Push
  2. まだ問題ですか?別のブランチ:git Push Origin master:fooにプッシュして、リモートリポジトリにマージします。
  3. または、-fを追加してプッシュを強制します(denyCurrentBranchは無視する必要があります)。

基本的にこのエラーは、リポジトリがリモートコードに対応していないことを意味します(インデックスと作業ツリーがプッシュしたものと一致していません)。

通常、最近の変更を取得するにはpullを最初に使用し、再びPushを使用する必要があります。

役に立たない場合は、別のブランチにプッシュしてみてください、例:

git Push Origin master:foo

次に、リモートリポジトリ上のこのブランチをmasterにマージします。

git rebaseを介して意図的に過去のコミットを変更し、その変更でレポをオーバーライドしたい場合は、おそらく-f/--forceパラメーターを追加してプッシュを強制する必要があります(rebaseを実行していない場合はお勧めしません)。それでも動作しない場合は、リモートでreceive.denyCurrentBranchignoreに設定する必要があります。これは、次のgitメッセージで示されています。

git config receive.denyCurrentBranch ignore
9
kenorb

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

3
JZAU

Gitリポジトリが(偶然に)同じ場所で2回初期化されたため、このエラーが発生しました。最初は非ベアリポジトリとして、すぐ後にベアリポジトリとして初期化されました。 .gitフォルダーが残るため、gitはリポジトリーが非ベアであると想定します。 .gitフォルダーと作業ディレクトリデータを削除すると、問題が解決しました。

1
xastor