Aber das tut nichts zur Sache. Der Server ist schnell aufgesetzt, und so füllte sich das Repository mehr und mehr mit Daten. Dann fanden auf einmal alle Leute CVS ganz toll, also dachte ich mir, es wird Zeit, zu Subversion zu wechseln, bevor alle denken, ich wäre, na ja, nicht mehr komisch genug.
Gesagt, tun, getan. Bei der Gelegenheit habe ich dann entdeckt, daß ich in all den CVS-Jahren nur einen einzigen Branch angelegt habe, und den auch nur, um das mal zu probieren. Im Nachhinein hat sich das als gute Idee herausgestellt. Also, nur einen Branch zu verlieren, meine ich.
Aber Subversion macht alles besser, ich konnte das Repository leidlich gut importieren, und in Subversion kann man prima branchen. Und taggen. Und viele andere Dinge. Eine ganz neue SCM-Euphorie bemächtigte sich meiner, und ich fange an, Projekte zu bauen, nur, um irgendwas in Subversion zu importieren, zu branchen und zu taggen. Interessanterweise bin ich extrem selten zum branchen gekommen, und ich kann mich an keine Merges erinnern. Hängt wohl mit der gewöhnungsbedürftigen Semantik von Subversion zusammen. Aber ich will nicht undankbar erscheinen: Für Projekte, in denen man weder sinnvoll branchen noch sinnvoll mergen kann (also z.B. bei der Versionierung von Bildern), kann ich mir vorstellen, auch nochmal Subversion zu benutzen.
Und schließlich kam der Moment, den alle Subversion-Verwalter ab dem zweiten Aufruf fürchten: Das Repository wird unhandlich groß, und man entscheidet sich, es aufzuteilen. Selbstredend soll die History erhalten bleiben.
Die Idee ist einfach: Im Repository projekte liegen fünf Projekte project_uno, duo_twin_double, triproj, quadra und p5 friedlich nebeneinander, jedes soll jetzt in ein eigenes Repository. Gründe für diese Aufteilungen finden sich immer, deshalb verzichte ich auf die Aufzählung. Aber wie schneide ich aus einem Subversion-Repository einen Zweig Objekte?
Na ja, ich will's nicht schwierig machen: Es geht nicht. Die innere Struktur von Subversion erlaubt das Ausschneiden von Subtrees offenbar nicht. Irgendwo habe ich dann gelesen, daß aufgrund der inneren Struktur der Werte im Zusammenspiel mit dem mechanischen Aufbau der Physik die Beobachtung zu machen geht nicht. (An der Stelle habe ich Kopfschmerzen bekommen und aufgegeben.)
Szenenwechsel. Unser Subversion-Repository wird links auf einer Liege von der Bühne geschoben, überall rote Tinte, die Krankenschwester füllt ein Formular aus und guckt auf die Uhr, Auftritt git im schwarzen Rollkragen-Armani-OP-Kittel als jung-dynamischer Chefarzt (ohne Vorhang, wir haben's eilig). Kurzer Blick auf den Patienten, Organisation der Operation in die Phasen Zurechtlegen, Zuschneiden und Zumachen, und etwas Beeilung bitte, der nächste Patient wartet schon, das kann ja nun wirklich nicht so schwer sein. Der Patient bekommt ein Sedativ, und los geht's.
Zurechtlegen: In unserem Szenario haben wir fünf Projekte in einem Repository. Das wird erstmal kopiert:
# ~/projekte/ > cd ..
# ~/ > git clone projekte p1
Checking out files: 100% (1930/1930), done.
# ~/ > cd p1
# ~/p1/ >
Intermission: Es sei bei dieser Gelegenheit ausdrücklich festgestellt, daß dieser Schritt wirklich extrem wichtig ist. Wir haben vor, alles bis auf ein Unterverzeichnis aus dem Repository unwiederbringlich zu löschen. Mit anderen Worten: Alles außer dem Verzeichnis, was wir im nächsten Schritt auswählen, wird gleich weg sein.
Stimme aus dem Off: Mach lieber eine Kopie mehr als eine zuwenig. Ehrlich. Bitte. Mach. Das. Sorgfältig. Und. Richtig. Nicht vergessen, wir reden hier von git: Schieb eine Kopie auf github, oder schick sie einem Kollegen, oder Deinem Bruder, oder Deinem Friseur, egal. Nur hab nicht im nächsten Schritt die einzige Kopie des Repositories unter'm Messer. Du würdest es bereuen.
Und weiter.
Zuschneiden: Ein Blick in das Repository verrät uns, daß wir es mit einer exakten Kopie des unter ~/projekte gespeicherten Repositories zu tun haben. Wir finden darin ein Verzeichnis project_uno, in das unsere fleißigen Entwicklerameisen emsig tonnenweise Code geschaufelt haben (natürlich haben wir selbst mindestens die Hälfte davon geschrieben, sonst dürften wir nicht so über unsere netten und geschätzten Kollegen reden). Aus diesem Verzeichnis project_uno machen wir jetzt ein eigenes Repository:
# ~/p1/ > git filter-branch --subdirectory-filter project_uno -- --all
(Meldungen von git hier, die abzutippen oder neu zu erfinden ich zu bequem bin, die der geneigte Zuschauer bei dieser Folge aber bitte genauestens zu lesen, zu verstehen und als nicht weiter kompliziert einzustufen hat.)
Genau, das war's schon. Ein einziger gekonnter Schnitt, und wir sind fertig. Schneller als ein Blinddarm, soviel ist sicher.
Zumachen: Zunächst einmal kümmern wir uns um die remote Referenzen: Das neue Repository einfach per push zu publizieren kann unangenehme Folgen haben, aber auch ein pull könnte uns Probleme bereiten. Da ich nicht dumm genug bin, das auszuprobieren, glaube ich den Warnungen und entferne erstmal die Remote-Verbindungen:
# ~/p1/ > git remote show
origin
# ~/p1/ > git remote show origin
* remote origin
URL: /home/me/projekte
Remote branch merged with 'git pull' while on branch master
master
Tracked remote branch
master
# ~/p1/ > git remote rm origin
So, jetzt kann es nicht mehr so einfach passieren, daß eine versehentlich verschüttele Kaffeetasse ein git push auslöst und unser Original verschandelt, von dem wir geklont haben. Ok, ganz ehrlich, viel kann da nicht passieren, aber sicher ist sicher. Wir haben jetzt ein schickes Repository, was wir unsererseits gleich mal klonen und verteilen können.
Nachdem wir wissen, wie's geht, wiederholt der Pförtner die Schritte für die anderen vier Projekte, die Vorstellung ist vorbei, das Original-Monster-Repositories unterschreibt noch schnell, in Zukunft keine Änderungen mehr zuzulassen und wird in ein Taxi am Bühneneingang geschoben, von wo es nie mehr zurückkehrt (es lebt jetzt mit einer Frau und drei Kindern auf Hawaii und arbeitet da in einer Telefonmarketing-Firma, ist aber ansonsten recht glücklich), und die jetzt getrennten siamesischen Fünflinge gehen gemeinsam auf Welttournee (sie sind sehr erfolgreich, allen zu erzählen, wie wunderbar es sicht getrennt lebt, und treten gemeinsam bei praktisch jeder Fernsehtalkshow auf, ohne jemals irgendetwas von Bedeutung getan zu haben). Git ist schon wieder auf dem Golfplatz und erklärt jedem, der es hören oder nicht hören will, wie unnütz und rundheraus dumm und häßlich Subversion und der Rest der häßlichen Verwandschaft ist, und wie glücklich alle sein können, daß es ihn gibt, aber da hört schon keiner mehr hin, weil alle an der Bar sitzen und sich über nervige Typen in Armani-Anzügen auslassen.
Na, das war ja mal Drama. Also, jetzt mal ganz ehrlich: Kann das Dein SCM?
Keine Kommentare:
Kommentar veröffentlichen