2008-09-21 10 views
7

Wenn unsere Organisation von einem zentralen Server VCS wie Subversion zu einem verteilten VCS wie Git wechseln würde, wie stelle ich sicher, dass mein gesamter Code vor Hardwarefehlern geschützt ist?Wie stelle ich sicher, dass mein Git Repo Code sicher ist?

Mit einem zentralen Server VCS muss ich nur das Repository jeden Tag sichern. Wenn wir ein DVCS verwenden würden, gäbe es auf allen Entwicklungsmaschinen viele Code-Verzweigungen, und wenn diese Hardware ausfallen würde (oder ein Entwickler seinen Laptop verlieren oder ihn gestohlen haben würde), hätten wir keine Backups .

Beachten Sie, dass ich es nicht eine gute Option zu "machen die Entwickler Push-Zweige zu einem Server" - das ist tedious und die Entwickler werden am Ende nicht tun.

Gibt es eine gemeinsame Lösung für dieses Problem?

Einige Klarstellung:

Mit einer nativ-central-Server VCS dann alles auf dem zentralen Server mit Ausnahme des Entwicklers letzten Änderungen werden muss. Wenn sich beispielsweise ein Entwickler entscheidet, einen Fehler zu beheben, befindet sich dieser Zweig auf dem zentralen Server und kann sofort gesichert werden.

Wenn wir ein DVCS verwenden, kann der Entwickler eine lokale Verzweigung (und tatsächlich viele lokale Verzweigungen) machen. Keiner dieser Zweige befindet sich auf dem zentralen Server und ist für die Sicherung verfügbar, bis der Entwickler denkt: "Oh ja, ich sollte das auf den zentralen Server schieben".

Also der Unterschied, den ich sehe (korrigieren Sie mich, wenn ich falsch liege!): Halb-implementierte Funktionen und Bugfixes werden wahrscheinlich nicht für die Sicherung auf dem zentralen Server verfügbar sein, wenn wir einen DVCS verwenden, aber mit normales VCS. Wie kann ich diesen Code schützen?

Antwort

12

Ich denke, dass Sie in der Praxis feststellen werden, dass Entwickler lieber ein zentrales Repository verwenden, als zwischen den lokalen Repositories zu pushen und zu ziehen. Sobald Sie ein zentrales Repository geklont haben, während Sie an Tracking-Zweigen arbeiten, sind das Abrufen und das Drücken trivialer Befehle.Das Hinzufügen von einem halben Dutzend Fernbedienungen zu allen lokalen Repositories Ihrer Kollegen ist mühsam und diese Repositories sind möglicherweise nicht immer zugänglich (ausgeschaltet, auf einem nach Hause genommenen Laptop usw.).

Irgendwann, wenn Sie alle am gleichen Projekt arbeiten, müssen alle Arbeiten integriert werden. Dies bedeutet, dass Sie einen Integrationszweig benötigen, in dem alle Änderungen zusammenkommen. Dies muss natürlich für alle Entwickler zugänglich sein, es gehört nicht zum Beispiel auf den Laptop des leitenden Entwicklers.

Sobald Sie ein zentrales Repository eingerichtet haben, können Sie einen cvs/svn style-Workflow zum Einchecken und Aktualisieren verwenden. cvs update wird zu git fetch und rebase, wenn du lokale Änderungen hast oder einfach git pull, wenn du keine lokalen Änderungen hast. cvs commit wird zu git commit und git push.

Mit diesem Setup befinden Sie sich in einer ähnlichen Position mit Ihrem vollständig zentralisierten VCS-System. Sobald Entwickler ihre Änderungen (git push) übermitteln, die sie tun müssen, um für den Rest des Teams sichtbar zu sein, befinden sie sich auf dem zentralen Server und werden gesichert.

Was Disziplin in beiden Fällen erfordert, verhindert, dass Entwickler lange laufende Änderungen aus dem zentralen Repository heraushalten. Die meisten von uns haben wahrscheinlich in einer Situation gearbeitet, in der ein Entwickler an dem Feature 'x' arbeitet, das eine grundlegende Änderung in einem Kerncode erfordert. Die Änderung wird dazu führen, dass alle anderen komplett neu erstellt werden müssen, aber die Funktion ist noch nicht für den Hauptstream bereit, also hält er sie einfach bis zu einem geeigneten Zeitpunkt ausgecheckt.

Die Situation ist in beiden Situationen sehr ähnlich, obwohl es einige praktische Unterschiede gibt. Wenn Sie git verwenden, weil Sie lokale Commits durchführen und lokale Historien verwalten können, ist die Notwendigkeit, zum zentralen Repository zu wechseln, für den einzelnen Entwickler möglicherweise weniger spürbar als für so etwas wie cvs.

Auf der anderen Seite kann die Verwendung von lokalen Commits als ein Vorteil verwendet werden. Es sollte nicht sehr schwierig sein, alle lokalen Commits an einen sicheren Ort im zentralen Repository zu verschieben. Lokale Zweige können in einem entwicklerspezifischen Tag-Namespace gespeichert werden.

Zum Beispiel könnte für Joe Bloggs ein Alias ​​in seinem lokalen Repository erstellt werden, um etwas wie das folgende in Reaktion auf (z.B.) git mybackup durchzuführen.

git push origin +refs/heads/*:refs/jbloggs/* 

Dies ist ein Single-Befehl, der an einer beliebigen Stelle (wie am Ende des Tages) verwendet werden können, um sicherzustellen, dass alle seine lokalen Änderungen sicher gesichert werden.

Dies hilft bei allen Arten von Katastrophen. Joe's Maschine explodiert, und er kann eine andere Maschine benutzen und holen wird gespeichert und weitermachen von wo er aufgehört hat. Joe ist krank? Fred kann Joes Äste holen, um die "must have" -Fix zu holen, die er gestern gemacht hat, aber keine Chance hatte, gegen den Meister zu testen.

Zurück zur ursprünglichen Frage. Muss zwischen dVCS und zentralisiertem VCS unterschieden werden? Sie sagen, dass halb-implementierte Features und Bugfixes nicht im dVCS-Fall in das zentrale Repository gelangen, aber ich würde behaupten, dass es keinen Unterschied geben muss.

Ich habe viele Fälle gesehen, in denen eine halb-implementierte Funktion auf einer Entwicklungsbox eines Entwicklers bleibt, wenn zentralisiertes VCS verwendet wird. Es erfordert entweder eine Richtlinie, die ermöglicht, dass halb geschriebene Merkmale in den Hauptstrom eingecheckt werden, oder es muss eine Entscheidung getroffen werden, um eine zentrale Verzweigung zu erstellen.

In der DVCS kann das gleiche passieren, aber die gleiche Entscheidung sollte getroffen werden. Wenn es wichtige, aber unvollständige Arbeiten gibt, müssen diese zentral gespeichert werden. Der Vorteil von git ist, dass die Erstellung dieses zentralen Zweigs fast trivial ist.

1

Es ist nicht ungewöhnlich, einen "zentralen" Server als Autorität in DVCS zu verwenden, der Ihnen auch die Stelle zur Verfügung stellt, an der Sie Ihre Backups durchführen können.

0

Sie könnten Entwickler Home-Verzeichnisse Remote-Geräte über das lokale Netzwerk bereitstellen. Dann müssen Sie sich nur darum kümmern, den Netzwerkspeicher sicher zu machen. Oder vielleicht könnten Sie etwas wie DropBox verwenden, um Ihr lokales Repo nahtlos an anderer Stelle zu kopieren.

+0

Home-Verzeichnisse mounten Remote-Geräte über das lokale Netzwerk
Wir haben das schon einmal versucht, und es ist in der Regel wegen Netzwerkverzögerung katastrophal. Das und es bedeutet eine Menge mehr Zeug für die Backup-Bänder. –

3

Ich denke, es ist ein Irrtum, dass die Verwendung eines verteilten VCS bedeutet, dass Sie müssen verwenden Sie es in einer vollständig verteilten Art und Weise. Es ist absolut gültig, ein gemeinsames Git-Repository einzurichten und jedem mitzuteilen, dass das Repository das offizielle ist. Für einen normalen Entwicklungs-Workflow würden Entwickler Änderungen aus dem gemeinsamen Repository abrufen und ihre eigenen Repositorys aktualisieren. Nur wenn zwei Entwickler aktiv an einer bestimmten Funktion mitarbeiten, müssen sie möglicherweise Änderungen direkt voneinander ableiten.

Mit mehr als ein paar Entwicklern, die an einem Projekt arbeiten, wäre es sehr mühsam, daran zu denken, Änderungen von allen anderen zu ziehen. Was würden Sie tun, wenn Sie nicht ein zentrales Repository haben?

Bei der Arbeit haben wir eine Backup-Lösung, die täglich alle Arbeitsverzeichnisse sichert und die ganze Menge wöchentlich auf eine DVD schreibt. Obwohl wir ein zentrales Repository haben, wird jedes einzelne gesichert.

+0

Greg - Ich habe die Frage geklärt, um hervorzuheben, dass ich über Halb-Implementieren-Feature/Bug-Zweige spreche. VCS oder DVCS dort müsste sowieso ein zentraler Server für Releases usw. sein. –

0

Alle Entwickler in Ihrem Team können auch eigene Zweige auf dem Server haben (pro Ticket oder nur pro Entwickler, usw.). Auf diese Weise brechen sie den Master-Zweig des Builds nicht, aber sie können weiterhin ihre Arbeit an den Server weitergeben, der gesichert wird.

My own git_remote_branch Werkzeug kann für diese Art von Workflow nützlich sein (Beachten Sie, dass es Ruby erfordert). Es hilft, entfernte Zweige zu manipulieren.

Als eine Nebenbemerkung, über Reposicherheit sprechen, können Sie auf Ihrem Server einen Post-Commit Hook einrichten, der einen einfachen Git Clone oder Git Push auf einen anderen Rechner ausführt ... Sie erhalten nach jedem eine aktuelle Sicherung verpflichten!

0

Wir verwenden Rsync, um die einzelnen Entwickler .git-Verzeichnisse in einem Verzeichnis auf dem Server zu sichern. Dies wird unter Verwendung von Wrapper-Skripten um den Git-Klon und den Post-Commit-Hooks usw. eingerichtet.

Da es in den Post-* Hooks gemacht wird, müssen Entwickler nicht daran denken, es manuell zu tun. Und da wir rsync mit einer Zeitüberschreitung verwenden, können Server, wenn der Server ausfällt oder der Benutzer remote arbeitet, immer noch arbeiten.

1

Ich finde diese Frage etwas bizarr. Angenommen, Sie verwenden ein nicht verteiltes Versionskontrollsystem wie CVS, haben Sie ein Repository auf dem zentralen Server und arbeiten auf den Servern der Entwickler. Wie sichern Sie das Repository? Wie sichern Sie die laufende Arbeit von Entwicklern? Die Antwort auf diese Fragen ist genau das, was Sie tun müssen, um Ihre Frage zu beantworten.

Mit verteilter Versionskontrolle sind Repositorys auf den Servern der Entwickler gerade in Arbeit. Willst du es sichern? Dann sichern Sie es! So einfach ist das.

Wir haben ein automatisches Backup-System, das alle Verzeichnisse von unseren von uns spezifizierten Rechnern abruft, also schließe ich alle Repositorys und Arbeitskopien auf meinem Rechner an, einschließlich Git- und CVS-Repositories.

Übrigens, wenn Sie die verteilte Versionskontrolle in einem Unternehmen verwenden, das ein Produkt freigibt, dann haben Sie ein zentrales Repository. Es ist der, von dem du loslässt. Es ist möglicherweise nicht auf einem speziellen Server; Es könnte auf der Festplatte eines Entwicklers sein. Das Repository, von dem Sie das Repository freigeben, ist jedoch das zentrale Repository. (Ich nehme an, wenn Sie noch nicht veröffentlicht haben, haben Sie vielleicht noch keine.) Ich habe das Gefühl, dass alle Projekte ein oder mehrere zentrale Repositories haben. (Und wirklich, wenn sie mehr als eins haben, sind es zwei Projekte und eines ist eine Gabelung.) Dies gilt auch für Open Source.

Auch wenn Sie kein zentrales Repository haben, ist die Lösung die gleiche: Sichern Sie die Arbeit an den Maschinen des Entwicklers. Du hättest das sowieso tun sollen. Die Tatsache, dass die laufende Arbeit in verteilten Repositories statt CVS-Arbeitskopien oder geraden nicht versionierten Verzeichnissen stattfindet, ist unerheblich.

+0

Wir sichern keine Entwickler-Workstations (es ist teuer, wenn Sie 100 davon haben) und ermutigen sie, ein paar Mal am Tag einzuchecken. Dann müssen wir nur den Server sichern. Das ist bei git keine Option. –

+0

Sie befinden sich immer noch in genau demselben Boot und stellen genau die gleiche Frage: Unterstützen Sie laufende Entwicklerarbeiten oder nicht? Du hast es nicht gewählt.Die verteilte Versionskontrolle macht diese Situation nicht schlechter oder besser. – skiphoppy

+0

Die zu realisierende Sache ist, dass die verteilte Versionskontrolle Ihren Code nicht auf viele Maschinen verteilt. Die einzige Sache, die auf vielen Maschinen verteilt wird, ist laufende Arbeiten, die Sie bereits nicht sichern. Irgendwo wird das Repository oder die Repositories sein, von denen Sie releasen; Rücken Sie die hoch. – skiphoppy