Git-Push-Fehler: Verweigerung der Aktualisierung des ausgecheckten Zweigs

Lesezeit: 8 Minuten

Git Push Fehler Verweigerung der Aktualisierung des ausgecheckten Zweigs
Irre

Ich habe einige Zusammenführungskonflikte gelöst, festgeschrieben und dann versucht, meine Änderungen zu pushen, und die folgende Fehlermeldung erhalten:

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'

Weiß jemand, was diesen Fehler verursachen könnte?

  • dupliziert: stackoverflow.com/questions/2816369/…

    – Cregox

    10. Oktober 2012 um 12:44 Uhr

  • Sie haben jetzt tatsächlich eine sichere Möglichkeit, mit Git 2.3.0 (Februar 2015) und git config receive.denyCurrentBranch=updateInstead: stackoverflow.com/a/28262104/6309

    – VonC

    1. Februar 2015 um 12:37 Uhr

  • Mögliches Duplikat von Git-Push-Fehler ‘[remote rejected] master -> master (Zweig ist derzeit ausgecheckt)’

    – Sören

    23. Juli 2018 um 17:16 Uhr

Git Push Fehler Verweigerung der Aktualisierung des ausgecheckten Zweigs
Shahbaz

Grund: Sie pushen in ein Non-Bare-Repository

Es gibt zwei Arten von Repositories: Bare und Non-Bare

Bare-Repositories haben keine Arbeitskopie und Sie können zu ihnen pushen. Das sind die Arten von Repositories, die Sie in Github erhalten! Wenn Sie ein Bare-Repository erstellen möchten, können Sie verwenden

git init --bare

Also, kurz gesagt, Sie können nicht in ein Nicht-Bare-Repository pushen (Bearbeiten: Nun, Sie können nicht in den aktuell ausgecheckten Zweig eines Repositorys pushen. Mit einem nackten Repository können Sie in jeden Zweig pushen, da keiner ausgecheckt ist. Obwohl möglich, ist das Pushen in nicht nackte Repositorys nicht üblich.) . Was Sie tun können, ist das Abrufen und Zusammenführen aus dem anderen Repository. So geht die pull request die Sie in Github sehen können, funktioniert. Sie bitten sie, von Ihnen zu ziehen, und Sie drücken nicht mit Gewalt in sie hinein.


Aktualisieren: Danke an VonC für den Hinweis, in den neuesten Git-Versionen (derzeit 2.3.0) ist das Pushen in den ausgecheckten Zweig eines nicht-nackten Repositorys möglich. Trotzdem können Sie immer noch nicht auf a pushen dreckig funktionierender Baum, was ohnehin keine sichere Operation ist.

  • Jawohl! Das ist richtig danke! Da ich ungefähr eine Million Dinge zu erledigen habe, habe ich versehentlich das Arbeitsverzeichnis geklont … doh!

    – Irre

    20. Juni 2012 um 11:10 Uhr

  • Tatsächlich können Sie problemlos in ein nicht-bares Repository pushen, Sie können nur nicht in den einen Zweig pushen, der es ist derzeit ausgecheckt.

    – Nirgendwo, Mann

    14. Februar 2013 um 15:18 Uhr

  • Es gibt tatsächlich Dutzende anderer Szenarien. Zum Beispiel befinden sich einige meiner Repositories nur auf meiner Workstation und meinem Laptop (kein Code, aber Notizen, die ich mache). Auf jedem habe ich zwei Zweige, “Workstation” und “Laptop”. Auf der Workstation checke ich nur “Workstation” aus und pushe nur auf den “Workstation”-Zweig auf dem Laptop (und umgekehrt).

    – Nirgendwo, Mann

    15. Februar 2013 um 16:50 Uhr


  • Sie haben jetzt tatsächlich eine sichere Möglichkeit, mit Git 2.3.0 (Februar 2015) und git config receive.denyCurrentBranch=updateInstead: stackoverflow.com/a/28262104/6309

    – VonC

    1. Februar 2015 um 12:36 Uhr

  • @skelly Dein Klon ist nicht nackt, während die Kopie auf github. Während also beide Klone den gesamten Verlauf haben, hat die Kopie auf Github kein Commit ausgecheckt, aber Ihre Kopie schon, damit Sie arbeiten können!

    – Shahbaz

    23. Januar 2016 um 19:26 Uhr

Git Push Fehler Verweigerung der Aktualisierung des ausgecheckten Zweigs
Sascha Pachev

Ich habe dieses Problem gelöst, indem ich zuerst überprüft habe, dass die Fernbedienung nichts ausgecheckt hat (es sollte wirklich nicht sein), und es dann mit:

$ git config --bool core.bare true

Danach hat git push gut funktioniert.

  • Dies ist die Einzeiler-Korrektur, nach der ich gesucht habe

    – Mr5o1

    24. Januar 2016 um 23:24 Uhr

  • Dadurch kann der Änderungsverlauf gepusht werden, aber diese Änderungen werden nicht im Non-Bare-Repo widergespiegelt.

    – jhill515

    8. August 2018 um 21:55 Uhr

  • wirst du git config core.bare false und git reset --hard ?

    – Flugzeug

    15. November 2019 um 14:53 Uhr

  • Wie oben erwähnt, wird die Fernbedienung nicht modifiziert, wenn Sie darauf drücken.

    – Benutzer1097111

    26. März 2020 um 15:58 Uhr

Zusammenfassung

Sie können nicht auf den einen ausgecheckten Zweig eines Repositorys pushen, da dies den Benutzer dieses Repositorys auf eine Weise durcheinander bringen würde, die höchstwahrscheinlich mit enden wird Verlust von Daten und Verlauf. Sie können jedoch auf jeden anderen Zweig desselben Repositorys pushen.

Da bei Bare-Repositories niemals ein Branch ausgecheckt ist, können Sie immer auf jeden Branch eines Bare-Repositorys pushen.

Autopsie des Problems

Wenn ein Branch ausgecheckt wird, fügt Commit ein neues Commit mit dem Kopf des aktuellen Branches als übergeordnetes Element hinzu und verschiebt den Kopf des Branches zu diesem neuen Commit.

Damit

A ← B
    ↑
[HEAD,branch1]

wird

A ← B ← C
        ↑
    [HEAD,branch1]

Aber wenn jemand zwischendurch auf diesen Zweig pushen könnte, würde der Benutzer selbst in das hineinkommen, was Git aufruft abgetrennter Kopf Modus:

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

Jetzt befindet sich der Benutzer nicht mehr in Zweig 1, ohne explizit darum gebeten zu haben, einen anderen Zweig auszuchecken. Schlimmer noch, der Benutzer ist jetzt außerhalb jeder Filialeund jeder neue Commit wird einfach sein baumeln:

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

Wenn der Benutzer an diesem Punkt einen anderen Zweig auscheckt, wird dieser baumelnde Commit hypothetisch zu einem fairen Spiel für Git Müllsammler.

  • Ich habe in stackoverflow.com/questions/2816369/… etwas erweitert.

    – Nirgendwo, Mann

    15. Februar 2013 um 16:52 Uhr


1646641691 247 Git Push Fehler Verweigerung der Aktualisierung des ausgecheckten Zweigs
Stephen G. Tuggy

Bei mir hat folgendes geholfen:

git config --global receive.denyCurrentBranch updateInstead

Ich habe Laufwerk F: fast vollständig eingerichtet, um mit Git zwischen meinem Windows 10-Desktop und meinem Windows 10-Laptop zu synchronisieren. Am Ende habe ich den obigen Befehl auf beiden Computern ausgeführt.

Zuerst habe ich das F-Laufwerk des Desktops im Netzwerk freigegeben. Dann konnte ich es auf meinem Laptop klonen, indem ich Folgendes ausführte:

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

Leider landeten alle Dateien auf meinem Laptop unter “F:\f”, nicht direkt unter F:\. Aber ich konnte sie manuell ausschneiden und einfügen. Git funktionierte danach immer noch vom neuen Standort aus.

Dann habe ich versucht, einige Änderungen an Dateien auf dem Laptop vorzunehmen, sie zu übertragen und sie zurück auf den Desktop zu verschieben. Das funktionierte nicht, bis ich den oben erwähnten Befehl git config ausführte.

Beachten Sie, dass ich alle diese Befehle auf beiden Computern in Windows PowerShell ausgeführt habe.

UPDATE: In einigen Fällen hatte ich immer noch Probleme, Änderungen voranzutreiben. Ich habe stattdessen einfach angefangen, Änderungen zu ziehen, indem ich Folgendes auf dem Computer ausführe, auf den ich die neuesten Commits ziehen möchte:

git pull --all --prune

cd in das Repo/Verzeichnis, in das Sie auf dem Remote-Computer schieben, und geben Sie es ein

$ git config core.bare true

  • Das funktioniert nicht. Das Repository bleibt nach dem Pushen leer.

    – Sören

    23. Juli 2018 um 17:17 Uhr

  • Wie von jhil515 oben gesagt, werden die nicht-nackten Dateien nicht aktualisiert, nur die Datenbanken.

    – Denis Cousineau

    13. Juni 2019 um 8:21 Uhr

1646641691 272 Git Push Fehler Verweigerung der Aktualisierung des ausgecheckten Zweigs
Johnny

Da es bereits ein bestehendes Repository gibt, wird ausgeführt

git config --bool core.bare true

auf dem Remote-Repository sollte ausreichen

Aus der core.bare-Dokumentation

Wenn wahr (bare = true), wird davon ausgegangen, dass das Repository leer ist und kein Arbeitsverzeichnis zugeordnet ist. Wenn dies der Fall ist, werden eine Reihe von Befehlen deaktiviert, die ein Arbeitsverzeichnis erfordern, wie z. B. git-add oder git-merge (aber Sie können dorthin pushen).

Diese Einstellung wird automatisch von git-clone oder git-init erraten, wenn das Repository erstellt wird. Standardmäßig wird angenommen, dass ein Repository, das auf „/.git“ endet, nicht leer ist (bare = false), während alle anderen Repositorys als leer angenommen werden (bare = true).

  • Das funktioniert nicht. Das Repository bleibt nach dem Pushen leer.

    – Sören

    23. Juli 2018 um 17:17 Uhr

  • Wie von jhil515 oben gesagt, werden die nicht-nackten Dateien nicht aktualisiert, nur die Datenbanken.

    – Denis Cousineau

    13. Juni 2019 um 8:21 Uhr

TLDR

  1. Ziehen & erneut drücken: git pull &&& git push.
  2. Immer noch ein Problem? Push in einen anderen Zweig: git push origin master:foo und führen Sie es auf einem Remote-Repo zusammen.
  3. Alternativ erzwingen Sie den Push durch Hinzufügen -f (denyCurrentBranch muss ignoriert werden).

Grundsätzlich bedeutet der Fehler, dass Ihr Repository mit dem Remote-Code nicht auf dem neuesten Stand ist (sein Index und sein Arbeitsbaum stimmen nicht mit dem überein, was Sie gepusht haben).

Normalerweise sollten Sie pull zuerst, um die letzten Änderungen zu erhalten und push es wieder.

Wenn dies nicht hilft, versuchen Sie, in einen anderen Zweig zu pushen, z.

git push origin master:foo

Führen Sie dann diesen Zweig im Remote-Repository wieder mit master zusammen.

Wenn Sie einige frühere Commits absichtlich über geändert haben git rebase und Sie Repo mit Ihren Änderungen überschreiben möchten, möchten Sie wahrscheinlich den Push durch Hinzufügen erzwingen -f/--force Parameter (nicht empfohlen, wenn Sie dies nicht getan haben rebase). Wenn es immer noch nicht funktioniert, müssen Sie es einstellen receive.denyCurrentBranch zu ignore auf der Fernbedienung, wie von einer Git-Nachricht vorgeschlagen über:

git config receive.denyCurrentBranch ignore

  • Einen Ast schieben statt zu master hat bei mir funktioniert. Ich ließ meinen lokalen Server ein Remote-Git-Repository auschecken und ich habe es vom lokalen Server ausgecheckt. Mir geht es gut, wenn ich meinen Zweig auf dem Server mit dem Master zusammenführe und ihn dann pushe. +1

    – NuclearPeon

    17. September 2020 um 1:39 Uhr


964380cookie-checkGit-Push-Fehler: Verweigerung der Aktualisierung des ausgecheckten Zweigs

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy