Verwendung von git als zentrales Repository

12

Ich habe git für meinen eigenen Gebrauch eingerichtet, damit ich von überall auf ein Projekt zugreifen und die Versionssicherheit gewährleisten kann, wenn ich hier an Teil X und hier an Teil Y arbeite, und bei Bedarf zusammenführen kann.

Allerdings hat nur eine meiner Entwicklungsmaschinen eine statische IP. Mein Gehirn steckt im CVS-Modus fest, also habe ich versucht, git so einzurichten, dass dieser Computer der "zentrale" Server ist, von dem alle anderen abrufen.

Diese Art von Arbeiten. Ich habe eine Reihe von AC-Maschinen, die einen Git-Pull vom 'Master' M ausführen. Sie machen Git-Pushs, um die Daten zurückzusenden.

Das Problem kommt, wenn ich am Master entwickle. Erstens kann ich nicht herausfinden, wie ich das zentrale Repo dazu bringen kann, die neueste Version bereitzustellen, ohne dies zu tun

git reset --hard HEAD

das scheint ein bisschen übertrieben. Und wenn ich vor dem Zurücksetzen auf dem zentralen Computer entwickle, bin ich mir nicht sicher, wie ich es mit Änderungen zusammenführen soll, die bereits vorgezogen wurden.

Etwas an meinem mentalen Modell ist weit weg. Hilfe?

Alex Feinman
quelle
Wenn Sie "Master" sagen, sprechen Sie über das Master-Repository oder über den Master-Zweig?
InnaM
Master-Repository
Alex Feinman
1
"master" im Git-Kontext ist normalerweise der Name des Standardzweigs.
InnaM
Dies gehört wahrscheinlich auf SO
Ken Liu

Antworten:

30

Sie möchten, dass Ihr zentrales Repository leer ist. Angenommen, die Maschine, auf der sie lebt, heißt static:

$ ssh static git init --bare /git/myproject.git

Dieses bloße Repository ist ein zentraler Treffpunkt: Es dient zum Drücken und Abrufen, nicht zum Entwickeln.

Führen Sie Ihre Entwicklung auf Klonen des zentralen Repositorys durch:

$ cd ~/src
$ git clone static:/git/myproject.git

Selbst wenn Sie aktiv sind static, arbeiten Sie in einem Klon:

$ git clone /git/myproject.git

Obwohl Sie der einzige sind, der an diesem Repository arbeitet, gewöhnen Sie sich an, an dem zu arbeiten, was in der Git-Dokumentation als Themenzweige bezeichnet wird . Ein unmittelbarer Vorteil davon ist, dass ein sauberer Master erhalten bleibt, dh Sie können jederzeit von Ihrem zentralen Master-Zweig in den Master Ihres aktuellen lokalen Repositorys ziehen, ohne ihn zusammenzuführen.

Beispielsweise:

$ git checkout -b fix-bug-in-foo
$ hack
$ git add file.c file.h
$ git commit -m "Fix ..."

Das scheint keine große Sache zu sein, aber es gibt Ihnen die Freiheit, das auf diesem Zweig dargestellte Projekt in einem teilweise gekochten Zustand zu belassen, oder wenn sich Ihre coole Idee als Flop herausstellt, können Sie diesen Zweig einfach ohne wegwerfen Brechen Sie alles andere in Ihrem Projekt, das bereits in anderen Branchen funktioniert. Unendliche freie Mulligans!

Vielleicht gehst du an diesem Abend nach Hause und hast eine neue Funktion hinzugefügt. Am nächsten Morgen du

$ git checkout master
$ git pull

um Ihren lokalen Master zu aktualisieren, um zu reflektieren, was sich im zentralen Repository befindet.

Angenommen, Sie haben den Foo-Fehler behoben und sind bereit, ihn in Ihren Hauptzweig aufzunehmen. Zuerst möchten Sie es in die Änderungen von gestern Abend integrieren:

$ git checkout fix-bug-in-foo
$ git rebase master

Der rebaseBefehl lässt Ihr Repository so aussehen, als hätten Sie den Foo-Fehler zusätzlich zu der neuen Funktion von gestern Abend behoben. (Das ist ähnlich svn update, aber flexibler und leistungsfähiger.)

Nun, um es in Ihren zentralen Master zu bekommen:

$ git checkout master
$ git merge fix-bug-in-foo
$ git push origin master

Wir haben den Meister als etwas Besonderes behandelt, aber das ist nur konventionell. Sie können die Arbeit an verschiedenen Zweigen verschiedener Repositorys über das Git-Repository staticgenauso einfach teilen .

Greg Bacon
quelle
1
Tolle Antwort, nagelt alle Probleme fest.
Dan Loewenherz
Meine git-Installation akzeptiert --bare nicht als Option für git init (alte Version ??), aber ich habe es umgangen, indem ich --bare mein vorhandenes Repo geklont und dann die Konfigurationsdateien ein wenig manuell bearbeitet habe.
Alex Feinman
Wenn Sie git 1.6.4.x ausführen, gibt es git init --barekeine anderen Argumente. Wenn festgelegt, wird entweder das aktuelle Arbeitsverzeichnis oder die Umgebungseinstellung GIT_DIR verwendet. Ich glaube, Sie brauchen Git 1.6.5.x, damit es ein Verzeichnisargument akzeptiert.
Darren Hall
4
Das ist die beste Erklärung für den Git-Workflow, die ich bisher für meine Arbeit gesehen habe.
Greg Graham
8

Wenn Sie einen zentralen Server mit einem zentralen Git-Repository haben, sollte dieses bareRepository ein Repository sein. In nackten Repositorys sind keine Arbeitskopien der Dateien enthalten. Wenn Sie also auf diesem zentralen Computer arbeiten, arbeiten Sie nicht direkt mit dem zentralen Repository, sondern mit einem lokalen Klon.

innaM
quelle
6

Diese Antwort ähnelt der Antwort von gbacon , geht jedoch davon aus, dass Sie bereits über ein lokales Repo-Setup verfügen und einen Remote-Master erstellen möchten, der als zentrales Repo behandelt wird. Es werden nur Details aus einem anderen Ansatz hinzugefügt.

Ich verwende git, um meine dot-config-Dateien zu speichern. Ich drücke und ziehe von dem, was ich als "zentrales Repo" betrachte. Es ist sehr praktisch, alle meine Punktedateien über mehrere Computer zurückzusetzen.

$ ssh example.com
$ mkdir dotconf.git && cd dotconf.git
$ git init --bare
$ exit

Dadurch wurde ein leeres Repo auf der Repo-Site erstellt.

Wenn ich bereits ein lokales Repo vor Ort habe, kann ich es an den Remote-Standort senden.

$ cd ~/src/dotconf

chdir in das lokale Verzeichnis.

$ git remote add origin ssh://example.com/~/dotconf.git

Fügen Sie das Remote-Repo als Ursprung hinzu, sodass Push / Pull auf dieses Repo einwirkt.

$ git push origin master

Schieben Sie meinen Master zum Ursprung (wie zuvor über die Git-Fernbedienung beschriftet). Jetzt wird dieses Remote-Repo als mein "zentrales Repo" behandelt. Alle meine Git Push / Pull werden mit dem Ursprung interagieren.

Wenn ich zu einem anderen Host gehe, kann ich das Repo einfach per Klon an einen neuen Ort ziehen.

$ git clone ssh://example.com/~/dotconf.git

Wenn ich die Entwicklung auf dem Remote-Server durchführen möchte, klone ich zuerst und drücke / ziehe dann zurück in das nackte Repo.

$ cd ~/src
$ git clone ~/dotconf.git
$ cd ~/src/dotconf
  * do coding *
$ git push
  * check in from another location *
$ git pull

Sie müssen wahrscheinlich Ihre Einstellungen vornehmen, git config --add branch.master.remote originum git pullsich nicht darüber zu beschweren, dass Sie nicht spezifisch genug sind. Die andere Alternative besteht darin, Ihren Hauptzweig auf --trackden Remote-Ursprung einzustellen . Nützlich, wenn Sie mehrere Zweige haben.

Darren Hall
quelle
1

Ich habe heute nur das gleiche Problem untersucht. Dieser Blog- Beitrag hat viele Diskussionen zu diesem Thema, aber die Mehrheit ist der Meinung, das zu tun, was Manni gesagt hat. In einem Kommentar zu dem Beitrag von David French finden Sie einige andere Möglichkeiten, einschließlich der Vorgehensweise, wenn Sie versehentlich in ein Repository wechseln, in dem keine nicht festgeschriebene Arbeit im Index oder im Arbeitsbaum vorhanden ist. "git reset –soft HEAD ^" setzt die gedrückte Änderung zurück, ohne Ihre Arbeit zu stören.

Greg Graham
quelle
2
Ein Problem mit diesem Blog-Beitrag besteht darin, die Nützlichkeit des Index zu überspringen. Hier ist ein guter Artikel, der erklärt, wie man mit git anstatt mit git arbeitet - osteele.com/archives/2008/05/my-git-workflow - Workflow-Diagramme sind enthalten.
Darren Hall