マージの競合をいくつか解決し、コミットしてから変更をプッシュしようとしましたが、次のエラーを受け取りました。
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'
誰もがこのエラーの原因を知っていますか?
リポジトリには2つのタイプがあります。 bareおよびnon-bare
ベアリポジトリには作業コピーがなく、プッシュすることができます。これらは、Githubで入手できるリポジトリの種類です!ベアリポジトリを作成する場合は、次を使用できます。
git init --bare
したがって、要するに、非ベアリポジトリにプッシュすることはできません (編集:さて、リポジトリの現在チェックアウトされているブランチにプッシュすることはできません。裸のリポジトリでは、何もチェックアウトされていないため、任意のブランチにプッシュすることができます。 。できることは、他のリポジトリから取得してマージすることです。これが、Githubで見ることができるpull request
の仕組みです。あなたは彼らにあなたから引くように頼みます、そしてあなたは彼らに無理やり押し込まないでください。
Update:これを指摘してくれたVonCに感謝します。最新のgitバージョン(現在2.3.0)では、 チェックアウトされたブランチにプッシュしています裸でないリポジトリの可能性 。それでも、dirty作業ツリーにプッシュすることはできません。これは、とにかく安全な操作ではありません。
この問題を解決するには、まずそのリモートに何もチェックアウトされていないことを確認し(実際には想定されていませんでした)、次に次のようにして公開しました:
$ git config --bool core.bare true
その後、Git Pushは正常に機能しました。
リポジトリのチェックアウトされたブランチにプッシュすることはできません。なぜなら、おそらくリポジトリがデータと履歴の損失で終わる方法でそのリポジトリのユーザーを混乱させるからです。ただし、同じリポジトリの他のブランチにプッシュすることはできます。
ベアリポジトリにはブランチがチェックアウトされないため、ベアリポジトリのブランチにいつでもプッシュできます。
ブランチがチェックアウトされると、コミットは現在のブランチのヘッドを親として新しいコミットを追加し、ブランチのヘッドをその新しいコミットに移動します。
そう
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のガベージコレクターにとって公平なゲームになります。
リモートマシンでプッシュしているリポジトリ/ディレクトリにcdして入力します
$ git config core.bare true
私にとっては、次のトリックでした:
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
既に既存のリポジトリがあるため、実行中
git config --bool core.bare true
リモートリポジトリで十分です
core.bareドキュメントから
True(bare = true)の場合、リポジトリは作業ディレクトリが関連付けられていない状態であると見なされます。この場合、git-addやgit-mergeなど、作業ディレクトリを必要とする多くのコマンドが無効になります(ただし、プッシュすることはできます)。
この設定は、リポジトリの作成時にgit-cloneまたはgit-initによって自動的に推測されます。デフォルトでは、「/。git」で終わるリポジトリはむき出しではないと想定されます(bare = false)。他のすべてのリポジトリはむき出しであると想定されます(bare = true)。
git pull &&& git Push
。git Push Origin master:foo
にプッシュして、リモートリポジトリにマージします。-f
を追加してプッシュを強制します(denyCurrentBranch
は無視する必要があります)。基本的にこのエラーは、リポジトリがリモートコードに対応していないことを意味します(インデックスと作業ツリーがプッシュしたものと一致していません)。
通常、最近の変更を取得するにはpull
を最初に使用し、再びPush
を使用する必要があります。
役に立たない場合は、別のブランチにプッシュしてみてください、例:
git Push Origin master:foo
次に、リモートリポジトリ上のこのブランチをmasterにマージします。
git rebase
を介して意図的に過去のコミットを変更し、その変更でレポをオーバーライドしたい場合は、おそらく-f
/--force
パラメーターを追加してプッシュを強制する必要があります(rebase
を実行していない場合はお勧めしません)。それでも動作しない場合は、リモートでreceive.denyCurrentBranch
をignore
に設定する必要があります。これは、次のgitメッセージで示されています。
git config receive.denyCurrentBranch ignore
リモートリポジトリがプッシュするブランチにある可能性があります。リモートマシンで別のブランチをチェックアウトしてみることができます。これらのエラーが消えて、リモートリポジトリに成功をプッシュしたので、これを行いました。 github.comではなくsshを使用して自分のサーバーに接続していることに注意してください。
Gitリポジトリが(偶然に)同じ場所で2回初期化されたため、このエラーが発生しました。最初は非ベアリポジトリとして、すぐ後にベアリポジトリとして初期化されました。 .gitフォルダーが残るため、gitはリポジトリーが非ベアであると想定します。 .gitフォルダーと作業ディレクトリデータを削除すると、問題が解決しました。