Ich verfolge ein Remote-Repository, dh ich habe refs/remotes/joe/master
.
Ich weiß, dass ich Joes Änderungen so schnell wie möglich in mein Repository übernehmen möchte.
Ich möchte nicht verwenden fetch
, weil ich vielleicht nicht am Computer bin, wenn er sich begeht. Also sage ich ihm: Vielleicht bin ich zum Einkaufen unterwegs, also drücke deine Änderungen bitte einfach auf refs/remotes/joe/master
.
Der Grund, warum ich seine Änderungen so schnell wie möglich in meinem Repo haben möchte, ist, dass er abends seinen Computer ausschaltet, damit ich seine Änderungen nicht holen kann, wenn ich vom Einkaufen zurückkomme.
Ich weiß, dass Joe nur ein bloßes, öffentliches Repository einrichten sollte, aber das ist eine Art Overhead.
Drängt zu refs/remotes/joes/master
in so einem fall okay?
“best/einfachste Möglichkeit, mehrere (nicht nackte) Git-Repos synchron zu halten” schlägt vor, mit dieser Art von Beitrag mit einem Post-Update-Hook umzugehen.
Es gibt jedoch eine einfachere Lösung:
Wie The OP zedoo kommentiert, die Thread auf git push zu einem nicht nackten Repo (geschrieben von Git-Maintainer Junio C Hamano, im Jahr 2007) Details:
(und es ist ein großartiges Beispiel für ein Fall, in dem es angemessen ist, auf ein Non-Bare-Repo zu pushen)
Receive-Pack aktualisiert die . nicht HEAD
reflog, da es den tatsächlichen Zweig aktualisiert, nicht HEAD
.
Wenn du stattdessen gedrängt hast HEAD
du solltest das sehen HEAD
reflog-Eintrag auch.
Was ist mit der Aufteilung? HEAD
wenn Sie zum darunter liegenden Zweig pushen und machen HEAD
ein Nicht-Symref?
Ich denke, dass keine der Komplikationen erforderlich sind, und ich denke, jemand hat Folgendes erwähnt: gutes Beispiel, das ist ein Firewall-Host, in den nur gepusht werden kann.
Obwohl er in diesem Beispiel weiß, dass er in der idealen Welt in umgekehrter Richtung abrufen kann, lässt ihn die Netzwerkkonfiguration dies nicht zu. daher brauche ich einen schub.
Um vernünftig damit umzugehen, können Leute, die zwischen nicht nackten Repositorys pushen, einfach vergessen, in Branch-Heads zu pushen.
Stattdessen können sie ihre Pushs so arrangieren, dass sie a wahres Spiegelbild ihres Abrufs die sie gerne tun könnten.
Um zu veranschaulichen:
Auf Repository A
das kann man nur hineinschieben, wenn man könnten aus Repository holen B
, du würdest:
$ git fetch B
mit sowas:
[remote "B"] fetch = refs/heads/*:refs/remotes/B/*
Aber leider weil man nur reinschieben kann A
von B
, du würdest das weiterlaufen lassen B
stattdessen:
$ git push A
mit:
[remote "A"] push = refs/heads/*:refs/remotes/B/*
Und nachdem Sie Ihren Push ausgeführt haben, du kommst mit repo zum automaten A
darauf und erinnere dich daran, dass das, was du getan hast, ein Spiegelbild von “git fetch B
“, du würdest:
$ git merge remotes/B/master
und du bist fertig.
Mit anderen Worten, denk nicht an refs/remotes/B
als etwas, das für den Gebrauch von “git fetch
“.
Sein Zweck besteht darin, das Remote-Repository zu verfolgen B
‘s Köpfe.
Sie pflegen diese Hierarchie, indem Sie fetch im Repository ausgeben A
.
Sie können Push-in-Repository ausgeben B
dies auch zu tun.
Ich pushe fast jeden Tag in ein Live-Repository.
Mein typischer Tag endet so:
gitster$ git push kernel-org-private
gitster$ ssh kernel.org
kernel.org$ git merge origin
kernel.org$ Meta/Doit -pedantic &
kernel.org$ exit
... go drink my tea ...
wo
gitster
ist meine private Entwicklungsmaschine
kernel.org
ist eine Maschine, die mir von freundlichen k.org-Leuten zur Verfügung gestellt wurde
Meta
ist eine Kasse von meinem ‘todo
‘Zweig und
Doit
ist ein Skript zum Erstellen aller vier öffentlichen Zweige.
Ich gehe immer ‘master
‘ auf meinem ausgecheckt kernel.org
Repository, und der Push von meinem privaten Computer ist erledigt (ich verwende immer noch das nicht separate Remote-Layout):
Push: refs/heads/master:refs/heads/origin
Push: refs/heads/next:refs/heads/next
Push: +refs/heads/pu:refs/heads/pu
Push: refs/heads/maint:refs/heads/maint
Also das erste, was ich tue, nachdem ich mich eingeloggt habe kernel.org
Maschine soll laufen”git merge origin
” um die ‘master
‘ auf dem neusten Stand.
Wenn Sie an ‘push
‘Spiegelbild von’fetch
‘ Sie würden verstehen, warum.
Es ist wie die Ausgabe von “git fetch” auf kernel.org
Maschine, um das druckfrische von meiner privaten Maschine zu holen und dann “git merge
” normalerweise ist es “git pull
” würde dies in einem einzigen Schritt tun).
Aber manchmal gehe ich aus Versehen ‘next
‘ geprüft.
Wenn ich herausfinde, dass ich nicht gegangen bin ‘master
‘ausgecheckt, würde ich tun”git reset --hard HEAD
” bevor ich etwas anderes tue, und ich möchte nicht, dass mein Druck manchmal dazu führt, dass ich distanziert bin HEAD
und manchmal nicht.
Ich möchte nicht die Information verlieren, in welcher Filiale ich zuletzt war (denn als nächstes würde ich herausfinden, in welcher Filiale Meta
/Doit
fehlgeschlagen).
Wenn ich war genervt genug, dass ich manchmal versehentlich in den Live-Zweig gedrängt habe, würde ich auf ein separates Remote-Layout umschalten und hineinschieben remotes/origin/*
Hierarchie, und danach gibt es wirklich nichts zu befürchten.
.
thread.gmane.org/gmane.comp.version-control.git/42506/… war das, wonach ich wirklich gesucht habe.
– zedoo
24. Okt ’10 um 13:44
Ich habe Ihren Kommentar komplett übersehen, daher habe ich eine Antwort gepostet, die diesen Thread detailliert beschreibt (sowie einen Verweis auf eine andere Lösung).
– VonC
24. Mai ’12 um 5:52