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

  1. GNU arch (tla)
    1. Links
    2. Mini-Howto
      1. Installation
        1. Debian
        2. Redhat
        3. Mandrake und SuSE
      2. Benutzung, Stand tla 1.2
        1. Archiv anlegen und erster Import
        2. Projekt auschecken
        3. Workdir updaten
        4. Was habe ich geändert?
        5. Änderungen committen
        6. Was hat sich im Archiv geändert?
        7. Branches
        8. einzelnen Patch aus anderem Branch einspielen
        9. einzelnes Patchset ungeschehen machen
        10. star-merge
        11. automatisches ChangeLog
    3. Tipps & Tricks
      1. Archiv-Browser
      2. CVS-Workdirs mit arch archivieren
      3. arch-Kontrolldateien/verzeichnisse vor CVS verbergen
      4. Verwendung mit Python
      5. Lesezugriff auf das repository über einen Webserver ohne WebDAV
      6. GUI dafür ?
    4. Bekannte Probleme
    5. Fragen

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

  • 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!


KategorieVersionsKontrollSystem

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

AltStyle によって変換されたページ (->オリジナル) /