master (Zweig ist gerade ausgecheckt)''/> master (Zweig ist gerade ausgecheckt)''/> master (Zweig ist gerade ausgecheckt)''/> Git push error '[remote rejected] master -> master (Zweig ist gerade ausgecheckt)' | germanylandofinnovation.com

Frage Git push error '[remote rejected] master -> master (Zweig ist gerade ausgecheckt)'


Gestern habe ich eine Frage gestellt, wie man ein Git Repository von einer meiner Maschinen zu einer anderen, Wie kann ich von einer anderen Maschine "klonen"?.

Ich bin jetzt in der Lage, ein Git-Repository von meiner Quelle (192.168.1.2) zu meinem Ziel (192.168.1.1) erfolgreich zu klonen.

Aber wenn ich eine Datei bearbeitet habe, a git commit -a -m "test" und ein git pushIch erhalte diesen Fehler an meinem Ziel (192.168.1.1):

git push                                                
hap@192.168.1.2's password: 
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: with what you pushed, and will require 'git reset --hard' to match
error: the work tree to HEAD.
error: 
error: You can set 'receive.denyCurrentBranch' configuration variable to
error: 'ignore' or 'warn' in the remote repository to allow pushing into
error: its current branch; however, this is not recommended unless you
error: arranged to update its work tree to match what you pushed in some
error: other way.
error: 
error: To squelch this message and still keep the default behaviour, set
error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git+ssh://hap@192.168.1.2/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://hap@192.168.1.2/media/LINUXDATA/working'

Ich benutze zwei verschiedene Versionen von Git (1.7 auf der Fernbedienung und 1.5 auf dem lokalen Rechner). Ist das ein möglicher Grund?


877
2018-05-12 06:06


Ursprung


Antworten:


Sie können Ihr Remote-Repository einfach in ein leeres Repository konvertieren (es gibt keine Arbeitskopie im leeren Repository - der Ordner enthält nur die tatsächlichen Repository-Daten).

Führen Sie den folgenden Befehl in Ihrem Remote-Repository-Ordner aus:

git config --bool core.bare true

Löschen Sie dann alle Dateien außer .git in diesem Ordner. Und dann wirst du in der Lage sein zu spielen git push in das Remote-Repository ohne Fehler.


1066
2017-07-14 22:45



Ich hatte gerade den gleichen Fehler, als ich anfing zu lernen Git. Einige der anderen Antworten sind eindeutig nicht für Git neu!

(Ich werde nicht technische Begriffe verwenden, um die Idee zu vermitteln.) Wie auch immer, Sie haben zwei Repositories, eins ist das Original, das Sie zuerst erstellt haben, und das andere ist das, das Sie gerade erstellt haben.

Sie befinden sich gerade in Ihrem Arbeitsrepository und verwenden den Zweig "Master". Aber Sie sind auch zufällig in Ihrem ursprünglichen Repository in den gleichen "Master" Zweig "eingeloggt". Jetzt, da du im Original "eingeloggt" bist, befürchtet Git, dass du etwas durcheinander bringen könntest, weil du vielleicht am Original arbeitest und alles vermasselst. Also müssen Sie zum ursprünglichen Repository zurückkehren und ein "git checkout someotherbranch" machen, und jetzt können Sie ohne Probleme pushen.

Ich hoffe das hilft.


644
2018-05-29 03:26



Die Fehlermeldung beschreibt, was passiert ist. Modernere Versionen von Git lehnen es ab, einen Zweig per Push zu aktualisieren, wenn dieser Zweig ausgecheckt ist.

Der einfachste Weg, zwischen zwei nicht-leeren Repositories zu arbeiten, ist entweder

  1. Aktualisieren Sie die Repositorys immer durch Ziehen (oder Holen und Zusammenführen) oder, wenn es sein muss,

  2. indem Sie zu einem separaten Zweig (einem Import-Zweig) wechseln und diesen Zweig dann in den Haupt-Zweig auf dem Remote-Rechner zusammenführen.

Der Grund für diese Einschränkung ist, dass die Push-Operation nur auf dem Remote-Git-Repository ausgeführt wird und keinen Zugriff auf den Index und den Arbeitsbaum hat. Also, wenn erlaubt, würde ein Druck auf den ausgecheckten Zweig die ändern  HEAD  inkonsistent mit dem Index und Arbeitsbaum im Remote-Repository zu sein.

Dies würde es sehr leicht machen, versehentlich eine Änderung zu bestätigen, die alle gedrückten Änderungen rückgängig macht und macht es auch sehr schwierig, zwischen lokalen Änderungen, die nicht begangen wurden, und Unterschieden zwischen den neuen zu unterscheiden HEAD, der Index und der Arbeitsbaum, die durch Schieben verursacht wurden HEAD.


118
2018-05-12 06:21



Zusammenfassung

Sie können nicht auf den einen ausgecheckten Zweig eines Repositorys zugreifen, da dies mit dem Benutzer dieses Repositorys auf eine Art und Weise verwechselt werden würde, mit der höchstwahrscheinlich Schluss sein wird Verlust von Daten und Geschichte. Sie können jedoch zu jedem anderen Zweig desselben Repositorys wechseln.

Da bare Repositories niemals einen Zweig ausgecheckt haben, können Sie immer zu einem beliebigen Zweig eines baren Repositorys wechseln.

Je nach Ihren Bedürfnissen gibt es mehrere Lösungen.

Lösung 1: Verwenden Sie eine Bare Repostiory

Wie vorgeschlagen, wenn Sie auf einem Computer das Arbeitsverzeichnis nicht benötigen, können Sie in ein leeres Repository wechseln. Um ein Durcheinander mit dem Repository zu vermeiden, können Sie es einfach klonen:

machine1$ cd ..
machine1$ mv repo repo.old
machine1$ git clone --bare repo.old repo

Jetzt können Sie alles, was Sie wollen, auf die gleiche Adresse wie zuvor schieben.

Lösung 2: Drücken Sie auf eine nicht ausgecheckte Verzweigung

Aber wenn Sie den Code auf Ihrer Fernbedienung auschecken müssen <remote>, dann kannst du einen speziellen Zweig benutzen, um zu drücken. Angenommen, Sie haben in Ihrem lokalen Repository Ihre Fernbedienung angerufen origin und du bist auf dem Ast Meister. Dann könntest du tun

machine2$ git push origin master:master+machine2

Dann müssen Sie es zusammenführen, wenn Sie in der origin Fern-Repo:

machine1$ git merge master+machine2

Autopsie des Problems

Wenn eine Verzweigung ausgecheckt wird, fügt das Committing ein neues Commit mit dem Kopf des aktuellen Zweigs als dessen Eltern hinzu und verschiebt den Kopf des Zweigs zu diesem neuen Commit.

Damit

A ← B
    ↑
[HEAD,branch1]

wird

A ← B ← C
        ↑
    [HEAD,branch1]

Aber wenn jemand dazwischen in den Zweig drücken könnte, würde der Benutzer sich selbst in die git-Calls bringen abgetrennter Kopf Modus:

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

Jetzt ist der Benutzer nicht mehr in branch1, ohne explizit nach einem anderen Zweig gefragt zu haben. Schlimmer noch, der Benutzer ist jetzt außerhalb jeder Brancheund jedes neue Commit wird nur sein baumelnd:

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

Hypothetisch, wenn zu diesem Zeitpunkt der Benutzer einen anderen Zweig überprüft, dann wird dieses dangling commit ein faires Spiel für Git's Müllsammler.


102
2018-02-14 16:28



Sie können diese "Einschränkung" umgehen, indem Sie die .git/config auf dem Zielserver. Fügen Sie Folgendes hinzu, um zu ermöglichen, dass ein git-Repository auch dann an "gecheckt" wird, wenn es "ausgecheckt" ist:

[receive]
denyCurrentBranch = warn

oder

[receive]
denyCurrentBranch = false

Der erste wird den Schub erlauben, während er vor der Möglichkeit warnt, den Ast zu durcheinander zu bringen, während der zweite es nur leise erlaubt.

Dies kann verwendet werden, um Code auf einem Server zu "deployen", der nicht zur Bearbeitung gedacht ist. Dies ist nicht der beste Ansatz, aber ein schneller Weg für die Bereitstellung von Code.


52
2017-12-16 05:17



Ich mag die Idee, immer noch ein brauchbares Repository auf der Remote-Box zu haben, aber statt eines Dummy-Zweigs verwende ich gerne:

git checkout --detach

Dies scheint eine sehr neue Eigenschaft von zu sein Git - Ich benutze Git Version 1.7.7.4.


38
2018-02-14 20:37



git config --local receive.denyCurrentBranch updateInstead

https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155

Verwenden Sie diese Option im Server-Repository und aktualisieren Sie außerdem die Arbeitsbaumstruktur, wenn keine nicht überschriebene Überschreibung erfolgt.

Es wurde hinzugefügt Git 2.3 wie von VonC erwähnt in den Kommentaren.

Ich habe Git 2.3 kompiliert und es versucht. Beispielverwendung:

git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead

cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master

cd ../server
ls

Ausgabe:

a
b

Yay, b wurde gedrängt!


31
2018-02-07 14:57



Ich hatte das gleiche Problem. Für mich verwende ich Git Push, um Code auf meine Server zu verschieben. Ich ändere nie den Code auf der Serverseite, also ist das sicher.

Im Repository möchten Sie Folgendes eingeben:

git config receive.denyCurrentBranch ignore

Dadurch können Sie das Repository ändern, während es eine Arbeitskopie ist.

Nachdem Sie einen Git-Push ausgeführt haben, gehen Sie zum Remote-Computer und geben Sie Folgendes ein:

git checkout -f

Dadurch werden die von Ihnen vorgenommenen Änderungen in der Arbeitskopie des Remotecomputers wiedergegeben.

Bitte beachten Sie, dass dies nicht immer sicher ist, wenn Sie Änderungen an der Arbeitskopie vornehmen, auf die Sie drücken.


26
2018-01-27 00:42