Ich empfehle inzwischen dringendst, anstatt RCS bazaar für die Konfigurationsverwaltung zu verwenden. Eine Anleitung findet man hier: bazaar-ng/KonfigurationsVerwaltung. Diesen Artikel möchte ich unverändert lassen. Evtl. findet jemand Nutzen darin, z.B. auf einem System, wo ihm kein bzr zur Verfügung steht. -- RomanKreisel 2007-02-17 11:59:41
Inhalt
Inhaltsverzeichnis
1. Vorwort
Auch wenn von den Autoren vielleicht nicht vorgesehen, habe ich mir vorgenommen mein /etc mit RCS zu verwalten. Die Vorteile, die daraus entstehen, sind klar:
- Keine alten Konfigurations-Dateien wie z.B. smb.conf.old-20041224
- Klare Versionierung
- Logs, um zu überprüfen, welche Veränderungen eine Datei durchlaufen hat
- "Zeitmaschine", um alte Versionen zurückzuholen
Jeder, bei dem eine Änderung schon einmal Probleme verursacht hat, weiß, wie hilfreich eine Rückverfolgung der Veränderungen gewesen wäre.
2. Was es nicht ist
RCS sollte nicht als einzige Instanz eines Backups dienen. Nichts geht über ein Backup auf einen vom System vollständig getrennten Datenträger wie z.B. CD-R oder Band.
3. Howto
Leider ist RCS nicht in der Lage die DateiRechte im Arbeitsverzeichnis beizubehalten. Deshalb habe ich für den Checkin und den Checkout zwei Wrapper-Skripte geschrieben, die mithilfe von getfacl und setfacl die DateiRechte sichern und wiederherstellen. Alle anderen Funktionen außer aus- und einchecken können mit den üblichen RCS-Utilites durchgeführt werden.
Das Einchecken von Dateien geht ganz einfach mit cmci datei1 datei2 datei3 --binary datei4 -b datei5 Die Dateien 4 und 5 sind hierbei Binärdateien.
Das Auschecken geht wiederum mit cmco: cmco -r1.1 datei1 -r1.2 datei2 datei3 Dies würde die Version 1.1 von datei1, die Version 1.2 von datei2 und die aktuelle Version von datei3 auschecken.
Für die restlichen Funktionen können die normalen RCS-Programme benutzt werden, so z.B.
rlog foobar |
Um die Historie der datei "foobar" zu betrachten |
rcsdiff -r1.2 -r1.3 foobar |
Um die Veränderungen von 1.2 auf 1.3 anzuzeigen |
rcs -kb foobar |
Um die Datei nachträglich als Binärdatei zu definieren |
4. Die Skripte
WARNUNG: Die Skripte sind noch weitestgehend ungetestet! Anwendung (wie immer) auf eigene Gefahr!
Verbesserungsvorschläge/Code willkommen! (RomanKreisel)
cmci:
# This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. if [ -z $1 ] then echo "You need to specify at least one file for checkin" exit fi case $1 in "--help" | "-h" ) echo "Usage: cmci [Flags] FILE [[Flags] FILE,...]" echo "" echo "-b, --binary Check this file in as binary" echo "-h, --help This Page" echo "" echo "Example:" echo "cmci foo --binary bar # Checks in foo as normal file, bar as binary" exit ;; esac until [ -z "$1" ] do BINARY="" # Check in binary file? case $1 in "--binary" | "-b" ) BINARY="TRUE" shift echo BINARY FILE ;; esac if [ ! -f $1 ] then echo "Sorry, but $1 is no regular file." echo "" exit 0 fi # First of all, create a RCS-Subdir, if it doesn't exist if [ -e `dirname $1`/RCS ] then if [ ! -d `dirname $1`/RCS ] then echo "`dirname $1`/RCS already exists but isn't a directory!" exit fi else echo "Creating RCS-Directory" mkdir `dirname $1`/RCS fi # Now, first get the permissions of the file to be remembered echo "Getting Permissions..." getfacl $1 > `dirname $1`/RCS/`basename $1`.permissions echo "DONE" echo "" # Time to Checkin (and automatically out again) echo "Checking in and out again..." if [ "$BINARY" == "TRUE" ] then test -e `dirname $1`/RCS/`basename $1`,v || rcs -i -kb $1 fi ci -l $1 if [ "$BINARY" == "TRUE" ] then rcs -kb $1 fi echo "DONE" echo "" # Now, since the file was checked out again, we need to re-set the # permissions echo "Re-applying Permissions..." setfacl --restore=`dirname $1`/RCS/`basename $1`.permissions echo "DONE" echo "" shift done
cmco:
# This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. if [ -z $1 ] then echo "You need to specify at least one file for checkout" exit fi case $1 in "--help" | "-h" ) echo "Usage: cmco [-rREVISION] FILE [[-rREVISION] FILE]" echo "" echo "-rx.y Checkout this revision" echo "-h, --help This Page" echo "" echo "Example:" echo "cmco foo -r1.1 bar # Checks out foo and version 1.1 of bar" exit ;; esac until [ -z "$1" ] do REVISION="" RCSOPTIONS="" if echo $1 | grep -q "^-r" # Shall we check out a specified revision? then REVISION=`echo $1 | cut -d r -f 2` shift fi if [ ! -z $REVISION ] then RCSOPTIONS="-r$REVISION" fi echo "Checking in and out again..." co $RCSOPTIONS $1 echo "DONE" # Now, since the file was checked out again, we need to re-set the # permissions echo "Re-applying Permissions..." setfacl --restore=`dirname $1`/RCS/`basename $1`.permissions echo "DONE" shift done
5. Tipps und Tricks
In RCS kann man auch schöne Felder definieren wie z.B. $Id$, $Header$ und so weiter. Ist hilfreich, um z.B. zu erkennen, um welchen Stand es sich bei der Datei handelt.
6. Kommentare
Danke, hab schon mal versucht sowas zu basteln, hab aber das Sichern der Rechte nicht hingekriegt. Funktioniert super, die acl-utils müssen natürlich installiert sein.
http://russell.rucus.net/blog/Geek/bzr-etc-howto Dies hier beschreibt eine wohl bessere Lösung mit BZR anstatt RCS