Normalerweise arbeite ich auf einem Remote-Server über ssh (screen und vim), wo ich ein Git-Repository habe. Manchmal bin ich nicht online, daher habe ich ein separates Repository (von meiner Fernbedienung geklont) auf meinem Laptop.
Ich kann jedoch nicht von diesem Repository auf der Remote-Seite abrufen, da ich normalerweise hinter einer Firewall stehe oder keine öffentliche IP-Adresse habe.
Ich habe gelesen, dass ich nur in ein nacktes Repository pushen sollte. Wie soll ich dann meine Änderungen in mein Remote-Repository übertragen?
git pull github master
.Antworten:
receive.denyCurrentBranch updateInstead
Diese Option wurde in Git 2.3 hinzugefügt und der Server aktualisiert seinen Arbeitsbaum, wenn er sauber ist.
Wenn Sie also sicherstellen, dass Sie immer ein Commit durchführen, bevor Sie lokal ziehen, und einen sauberen Arbeitsbaum auf dem Server behalten (was Sie tun sollten, um Zusammenführungskonflikte zu vermeiden), ist diese Option eine gute Lösung.
Beispielnutzung:
Ausgabe:
quelle
--local
optional?--local
betrifft nur das aktuelle Verzeichnis,--global
betrifft alle Git-Repos mit~/.gitconfig
, sieheman git-config
.Beste Option
Die wahrscheinlich sauberste, am wenigsten verwirrende und sicherste Möglichkeit, in Ihr nicht nacktes Remote-Repository zu pushen, besteht darin, auf dedizierte Zweige in der Fernbedienung zu pushen, die Ihre Laptop-Zweige darstellen.
Schauen wir uns den einfachsten Fall an und nehmen wir an, dass Sie in jedem Repo nur einen Zweig haben: master. Wenn Sie von Ihrem Laptop auf das Remote-Repo drücken, drücken Sie statt Master -> Master, Master -> Laptop-Master (oder einen ähnlichen Namen). Auf diese Weise wirkt sich der Push nicht auf den aktuell ausgecheckten Hauptzweig im Remote-Repo aus. Um dies vom Laptop aus zu tun, ist der Befehl ziemlich einfach:
Dies bedeutet, dass der lokale Master-Zweig in den Zweig "Laptop-Master" im Remote-Repository verschoben wird. In Ihrem Remote-Repo haben Sie einen neuen Zweig namens "Laptop-Master", den Sie dann in Ihren Remote-Master einbinden können, wenn Sie bereit sind.
Alternative Option
Es ist auch möglich, nur master -> master zu drücken, aber das Verschieben in den aktuell ausgecheckten Zweig eines nicht nackten Repos wird im Allgemeinen nicht empfohlen, da es verwirrend sein kann, wenn Sie nicht verstehen, was los ist. Dies liegt daran,
git status
dass beim Verschieben in einen ausgecheckten Zweig der Arbeitsbaum nicht aktualisiert wird. Wenn Sie also in den ausgecheckten Zweig einchecken, in den verschoben wurde, werden genau die entgegengesetzten Unterschiede angezeigt wie beim letzten Verschieben. Besonders verwirrend wäre es, wenn der Arbeitsbaum vor dem Push verschmutzt wäre. Dies ist ein wichtiger Grund, warum dies nicht empfohlen wird.Wenn Sie versuchen möchten, nur master -> master zu drücken, lautet der Befehl einfach:
Wenn Sie jedoch zum Remote-Repo zurückkehren, möchten Sie höchstwahrscheinlich einen Vorgang ausführen,
git reset --hard HEAD
um den Arbeitsbaum mit dem Inhalt zu synchronisieren, der übertragen wurde. Dies kann gefährlich sein , da nicht festgeschriebene Änderungen im Remote-Arbeitsbaum, die Sie beibehalten möchten, diese löschen. Stellen Sie sicher, dass Sie die Konsequenzen kennen, bevor Sie es versuchen, oder erstellen Sie zuerst ein Backup!BEARBEITEN Seit Git 2.3 können Sie "Push-to-Deployment" -Git-Push verwenden: https://github.com/blog/1957-git-2-3-has-been-released . Das Verschieben in einen separaten Zweig und das anschließende Zusammenführen ist jedoch normalerweise besser, da eine tatsächliche Zusammenführung durchgeführt wird (daher funktioniert dies mit nicht festgeschriebenen Änderungen genauso wie die Zusammenführung).
quelle
git config receive.denyCurrentBranch ignore
muss vor demgit push origin master:laptop-master && ssh user@remotemachine 'cd repos_path && git merge laptop-master'
Ich würde vorschlagen, ein Bare-Repository und ein lokal funktionierendes (nicht Bare) Repos auf Ihrem Server zu haben. Sie können Änderungen vom Laptop zum Server-Bare-Repo übertragen und dann von diesem Bare-Repo zum Server-Working-Repo übertragen. Der Grund, warum ich dies sage, ist, dass Sie möglicherweise viele vollständige / unvollständige Zweige im Server haben, die Sie auf dem Laptop replizieren möchten.
Auf diese Weise müssen Sie sich keine Gedanken über den Status des Zweigs machen, der auf dem Server-Repo ausgecheckt wurde, während Sie Änderungen an den Server übertragen.
quelle
Eine andere Möglichkeit besteht darin, einen umgekehrten SSH-Tunnel einzurichten, damit Sie ziehen statt schieben können.
Und wenn Sie möchten, dass der Tunnel im Hintergrund verläuft
quelle
Du kannst tun:
$git config --bool core.bare true
Dies kann im nackten oder zentralen Repository erfolgen, sodass alle Dateien akzeptiert werden, die aus nicht nackten Repositorys übertragen werden. Wenn Sie dies in einem nicht nackten Repository tun, können wir keine Dateien von einem nicht nackten in ein nacktes Repository verschieben.
Wenn Sie GIT üben, indem Sie ein zentrales und nicht nacktes Repo auf dem PC erstellen, werden die übertragenen Dateien auf einigen PCs möglicherweise nicht angezeigt, aber es wurde verschoben. Sie können es überprüfen, indem Sie ausführen.
$git log
im zentralen repo.Anders als wenn Sie auf GitHub pushen, werden die Dateien dort angezeigt.
quelle