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

Vergleiche mit anderen Versionierungssystemen:

Einsteiger-Artikel:

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

Mandrake und 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

Fragen

Hat jemand Erfahrungen damit? Wenn ja: welche?

-- Christian "cehteh" Thäter

-- BastianBlank

Warum kommt am Ende von tla import die Fehlermeldung imprev: import aborted?

tla import ändert die timestamps aller Dateien auf die aktuelle Zeit - warum? Wie kann ich das verhindern?


KategorieVersionsKontrollSystem

GnuArch (zuletzt geändert am 2007-12-23 22:49:40 durch localhost)