GNU arch (tla)
GNU arch ist ein Versionierungssystem ähnlich cvs, löst aber einige Probleme und Unzulänglichkeiten von CVS deutlich besser.
Homepage: http://www.gnu.org/software/gnu-arch/
Wiki: http://wiki.gnuarch.org/ (MoinMoin basiert )
Freshmeat-Eintrag: http://freshmeat.net/projects/archrevctl/
Lizenz: GPL
Inhalt
Inhaltsverzeichnis
Links
Vergleiche mit anderen Versionierungssystemen:
Version Control System Comparison Vergleich zwischen cvs, aegis, arch, bitkeeper, Monotone, OpenCM und SubVersion
Einsteiger-Artikel:
Offizielles Tutorial (spiegel1 spiegel2)
gutes Tutorial am konkreten Beispiel und mit Tipps zur Praxis. Dort wird tla behandelt, die neuere C-Version.
kurze Einführung, bezieht sich auf larch
http://repose.cx/ArchPrimer.html
tla-Einführung für Einzelkämpfer
linux.de.workshop/arch Log eines Workshops des #linux.de Kanals auf Freenode
Weiterführendes:
Mini-Howto
Installation
Debian
Die C-Version von arch heißt tla und ist in Debian unstable.
# als root: installieren apt-get install tla
Debian-Pakete (nightly snapshots): http://people.debian.org/~asuffield/arch/
Debian-Pakete fuer woody: http://www.backports.org/package.php?search=tla
Redhat
Wer eine Version vor RH9 benutzt, kann per rpmbuild --rebuild tla-1.0.6-aap1.src.rpm ein Paket für seine Version bauen.
Mandrake und SuSE
http://rpmfind.net/linux/rpm2html/search.php?query=tla&submit=Search - das Mandrake-RPM tut nach Anwender-Berichten auch für SuSE.
Benutzung, Stand tla 1.2
Archiv anlegen und erster Import
tla my-id "Thomas Waldmann <mymail@myprovider.de>" tla make-archive meinemail@meinprovider.de--archive /var/local/arch #signiert: #tla make-archive -s meinemail@meinprovider.de--archive /var/local/arch # alternativ zu einem lokalen Pfad kann man auch sftp://user@host/path angeben tla my-default-archive meinemail@meinprovider--archive # projekt anlegen cd meinproj tla archive-setup meinproj--meinbranch--1.0 # projekt initalisieren: tla init-tree meinproj--meinbranch--1.0 tla id-tagging-method explicit # siehe auch Tipps weiter unten zu Python, CVS usw. tla changelog >>ChangeLog # dies sollte jetzt die zu archivierenden Sourcefiles ausgeben: tla inventory --names --source --both| less # wenn der vorhergehende Befehl die richtige Liste produziert hat, # können wir damit die Dateien markieren: tla inventory --names --source --both| xargs tla add # logfile erzeugen: vi -- `tla make-log` # alles importieren: tla import #1.2 (inkl. setup-archive): #tla import -S
Projekt auschecken
# neueste Version: tla get meinproj--meinbranch # oder um eine bestimmte Version zu holen: tla get meinproj--meinbranch--1.0
Workdir updaten
# wenn andere Entwickler mit cvs arbeiten, und man die Änderungen aus dem cvs holen will: #cvs -nq upd 2>&1 | grep "no[[:space:]]longer" | awk '{print $3}' > ,,deletes #cvs -nq upd 2>&1 | grep ^U | awk '{print $2}' > ,,adds #cvs upd #tla add-tag `cat ,,adds` #tla delete-tag `cat ,,deletes` # bei kleinen Änderungen kann man auch nur cvs upd machen und dann ggf. manuell # add-tag und delete-tag aufrufen, wenn Dateien hinzugekommen oder gelöscht worden # sind. # Ansonsten Änderungen aus dem Archiv holen: tla update
Was habe ich geändert?
# nur die Dateinamen: tla changes # Dateinamen und Differenzanzeige: tla changes --diffs # zur Differenzanzeige wird eine lokal gecachte Original-Version verwendet, # dies geht also auch "offline"!
Änderungen committen
# wichtig: wenn parallel auch cvs verwendet wird, dann direkt *nach* dem cvs commit einen tla commit!: #cvs commit ... # wenn man nur einen kurzen Kommentar zu seinen Änderungen machen will: tla commit -L "was hab ich nur getan..." # bei längeren Kommentaren erzeugt man erst ein logfile: vi -- `tla make-log` # und committed dann: tla commit
Was hat sich im Archiv geändert?
tla revisions --summary --creator #oder tla changelog
Branches
Jemand anderes legt nun einen Branch an (nachdem er, siehe oben, meinproj--andererbranch--1.0 in seinem Archiv andereemail@andererprovider.de--anderesarchiv angelegt und als default eingestellt hat):
tla tag \ meineemail@meinprovider.de--archive/meinproj--meinbranch--1.0--patch-1 \ meinproj--andererbranch--1.0 # wenn auch das Quellarchiv im Default-Repository ist und man den letzten Stand # branchen will, reicht die Kurzform: tla tag meinproj--meinbranch--1.0 meinproj--andererbranch--1.0 # außerdem will man die Branch-Basisversion lokal cachen, falls das andere Archiv ausfällt: tla archive-cache-revision meinproj--andererbranch--1.0--base-0 # damit bekommt man das workdir (das sich noch auf meinbranch--1.0--patch-1 befindet) # auf den aktuellen Stand: tla join-branch meinproj--andererbranch--1.0 # und damit sagt man ihm, dass es jetzt zu meinproj--andererbranch--1.0 gehört: tla set-tree-version meinproj--andererbranch--1.0
einzelnen Patch aus anderem Branch einspielen
cd meinproj--meinbranch tla replay meinproj--andererbranch--1.0--patch-42
einzelnes Patchset ungeschehen machen
Das geht nicht wirklich, der patch bleibt im Repository. Aber man kann die entsprechenden Codeanteile aus dem aktuellen Code entfernen und damit ein neues Patchset erstellen:
# TODO: genauer formulieren: #get patch-3 changeset #dopatch --reverse #commit
star-merge
# Zusammenführen, die erstgenannte Version wird bei Konflikten bevorzugt: tla star-merge --in-place \ meineemail@meinprovider.de--archive/meinproj--meinbranch--1.0 \ andereemail@andererprovider.de--anderesarchiv/meinproj--andererbranch--1.0 \ ./meinproj-merged
automatisches ChangeLog
Wer ein ChangeLog haben möchte, das sich automatisch beim commit aktualisiert, kann Folgendes machen:
tla changelog >ChangeLog head -n2 ChangeLog tla add-tag -t 'automatic-ChangeLog--arch@arch.thinkmo.de--2003-archives' ChangeLog # ======================================================== # diesen String dem Kopf der Datei ChangeLog entnehmen!
Tipps & Tricks
Archiv-Browser
Es gibt auch einen grafischen Archiv-Browser für Apache und PHP4: Perspective
CVS-Workdirs mit arch archivieren
Für eine Übergangsphase will man möglicherweise arch und cvs parallel benutzen und alle Kontrollfiles von CVS in arch mitarchivieren.
Dazu sind folgende Änderungen an {arch}/=tagging-method notwendig:
precious ^(\+.*|\.gdbinit|\.#ckpts-lock|=build\.*|=install\.*|RCS|RCSLOG|SCCS|TAGS)$ # ^ CVS... entfernen source ^([_=a-zA-Z0-9].*|\.cvsignore)$ # = ============= .cvsignore hier hinzugefügt
arch-Kontrolldateien/verzeichnisse vor CVS verbergen
echo -e "{arch}\n.arch-ids" >> .cvsignore # oder gleich für alle Dateien: find . -name ".cvsignore" -exec sh -c "echo -e \"{arch}\n.arch-ids\n\" >> {}" \;
Verwendung mit Python
Man will *.pyo/pyc ignorieren, daher {arch}/=tagging-method editieren:
precious ^(\+.*|\.gdbinit|\.#ckpts-lock|=build\.*|=install\.*|.*\.(pyo|pyc)|RCS|RCSLOG|SCCS|TAGS)$ # ============== hinzufügen
Lesezugriff auf das repository über einen Webserver ohne WebDAV
Für einen read-only Zugriff auf das repository ohne WebDAV müssen ".listing" Dateien in den arch Verzeichnissen platziert werden. Diese Aufgabe übernimmt tla, wenn man das archiv wie folgt anlegt:
tla make-archive --listing meinemail@meinprovider.de--archive /var/local/arch
GUI dafür ?
Gibt es auch mit Archway (Perl)
Bekannte Probleme
tla get ... meckert über Zugriffsprobleme und bricht ab.
- dies tritt dann auf, wenn im aktuellen Verzeichnis ein nicht-zugreifbares Unterverzeichnis existiert.
Bug in der WebDav-Authentifizierung
Bugreport ( Der dort vorgeschlagene Fix ist falsch. Den Thread bitte ganz lesen!)
Fragen
Hat jemand Erfahrungen damit? Wenn ja: welche?
- funktioniert gut
- Performance ok
- technisch CVS deutlich überlegen
-- Christian "cehteh" Thäter
- Performance in Vergleich zu CVS beschissen (Patchsets sind horrible expensive)
- Working Copies "wachsen" immer weiter.
-- BastianBlank
Warum kommt am Ende von tla import die Fehlermeldung imprev: import aborted?
der Source-Tree ist vermutlich nicht sauber. Mit tla tree-lint kann man sich die problematischen Dateien anzeigen lassen. Erst wenn tree-lint zufrieden (also still) ist, gelingt der import.
tla import ändert die timestamps aller Dateien auf die aktuelle Zeit - warum? Wie kann ich das verhindern?
- wie bei einem Kopiervorgang werden die Timestamps ganz normal auf die aktuelle Zeit gesetzt
- das Beibehalten des Timestamps macht keinen Sinn:
- angenommen man checkt eine Datei von 1995 aus, dann könnte man einen Timestamp von 1995 erwarten
- angenommen man hat bereits eine Version dieser Datei und patcht sie auf den selben Stand wie 95, dann müsste sie eigentlich den aktuellen Timestamp bekommen (mtime == Zeit der Modifikation)
- da dies dann zwar vom Inhalt her gleich ist, aber je nach Methode ein anderer Timestamp sinnvoll wäre, verzichtet arch auf das Archivieren von timestamps - dies ist also beabsichtigt!