#pragma section-numbers on /!\ 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 <<DateTime(2007-02-17T11:59:41Z)>> '''Inhalt''' <<TableOfContents>> = 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. = 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. = 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 || = Die Skripte = WARNUNG: Die Skripte sind noch weitestgehend ungetestet! Anwendung (wie immer) auf eigene Gefahr! Verbesserungsvorschläge/Code willkommen! (RomanKreisel) cmci: {{{ #!/bin/bash # 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: {{{ #!/bin/bash # 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 }}} = 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. = 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