Das ProblemKonfigurationsdateien auf einem Server (i.d.R "/etc") ändern sich häufiger - und man möchte eine Historie - wann, was, warum modifiziert wurde. Das Problem wird noch schlimmer wenn mehrere Personen einen Server konfigurieren.
Person A sollte wissen wann, was und warum
Person B z.B. die Webserverkonfiguration modifiziert hat.
Welches SCM Zuerst dachte ich an
Subversion, da ich dieses
SCM schon von der Programmierung kannte.
Folgende Punkte sprechen aber dagegen:
- Subversion erzeugt in jedem Verzeichnis in der "Working Copy" ein ".svn"-Verzeichnis
- die Geschwindigkeit bei vielen Dateien ist bei Subversion "nicht der Renner"
- das Subversion-Backend ("Dateisystem") wird schnell sehr groß
- das Konzept der "Working Copy" (welche erst ausgecheckt werden muss) und dem zentralen Repository ist hier leider etwas umständlich
Lösung: eine verteilte Versionsverwaltung.
Für diesen Zweck habe ich mir folgende verteilte Versionsverwaltungen angesehen:
Entscheidung: Ich habe mich für
Mercurial aus folgenden Gründen entschieden:
- einfache Verwendung
- gute Performance, Repository-Größe klein
- integrierter Webserver
Wie wird es gemachtSchritt 1: man initialisiert ein neues Repository im "Root" des Dateisystems (
"cd /"). Das geschieht mit dem Kommando
"hg init". Nun legt Mercurial ein .hg-Verzeichnis in / an (es wird aber wirklich nur ein einziges Verzeichnis angelegt!).
Schritt 2: Dateien aus "/etc" zum Repository hinzufügen (unter Versionskontrolle stellen) geht mit dem Kommando
"hg add /etc".
Schritt 3: Mit einem
"hg commit" werden die neu hinzugefügten Dateien ins Repository übertragen.
Hier noch ein paar nützliche Kommandos:
Status abfragen: "hg status -amrd" (added, modified, removed, deleted)
Dateien umbenennen: mit
"hg rename QUELLE ZIEL" kann man dann Dateien umbenennen. Man sollte also anstatt "mv" in Zukunft einfach dieses Kommando verwenden.
Dateien löschen: mit
"hg remove DATEI/VERZEICHNIS" kann man die Datei oder das Verzeichnis aus der Versionierung nehmen. Ohne Parameter löscht
"hg remove" auch die lokale Datei oder das Verzeichnis. Wenn man nur die Datei oder das Verzeichnis aus der Versionskontrolle nehmen will diese aber lokal behalten möchte sollte man
"hg remove -Af DATEI/VERZEICHNIS" verwenden.
Unterschiede ansehen: mit
"hg diff DATEI/VERZEICHNIS" kann man sich den Unterschied zwischen der lokalen Version und der im Repository befindlichen Version ansehen.
Repository für andere zugänglich machen: den eingebauten kleinen Webserver kann man mit
"hg serve" starten. Dann kann man über "http://IP:8000" auf das Repository zugreifen. Hier ein paar Screenshots:


Repository "klonen": mit dem Kommando
"hg clone http://URL ZIEL" kann man eine Repository-Kopie erstellen.
Grafischer Repository-Browser: sogar ein grafischer Repository-Browser ist bei Mercurial enthalten. Diesen bekommt man mit dem Kommando
"hg view":
Konfiguration: Es gibt eine globale Konfiguration in "/etc/mercurial/hgrc" und pro User eine im Home-Verzeichnis "~/.hgrc". Mehr Informationen hierfür gibts mit
"man hgrc".
Shell completion: Mercurial liefert wohl auch eine
zsh-Completion mit. Dazu evtl. in einem folgenden Blog-Beitrag mehr.
Debian: Wer wie ich immer noch
Debian Etch verwendet findet eine aktuellere Version von Mercurial im
Backports-Reporitory.
Übrigens: das Projekt
FSVS ist mir auch in den Sinn gekommen. Ich fand die Bedienung zu kompliziert und das Programm verwendet das SVN-Backend, was meiner Meinung nicht die beste Wahl hierfür ist. Dieses Programm berücksichtigt dann noch die Dateirechte und Benutzer/Gruppe. Das kann die hier vorgestellte Lösung nicht.
Update 14.03.2009: Wie ich heute gesehen habe gibt es auch das Projekt
etckeeper das man mit mercurial, git, darcs und bzr verwenden kann. Es bietet Paketmanager-Integration und speichert Metadaten (u.a. Rechte) der Dateien mit ab. Sehr interessante Sache - das werde ich mal versuchen.
Weitere Links: