AmiVCS

Handbuch – Versionsverwaltung für den Amiga und den PC · Stand 08.11.2026 (Programmversion 0.10)

Dieses Handbuch gehört zu AmiVCS 0.10. Der schnelle Einstieg steht in der Schritt-für-Schritt-Anleitung.

Hinweis: Experimentelle Software, entwickelt mit Hilfe von Claude (KI-Assistent von Anthropic) und in erster Linie für den Eigengebrauch des Autors geschrieben. Bitte zuerst mit Kopien der Daten ausprobieren; Benutzung auf eigene Gefahr.

AmiVCS ist eine kleine, bewusst einfach gehaltene Versionsverwaltung für AmigaOS 3.x und den PC (macOS/Linux/Windows). Fast alles läuft rein lokal im Arbeitsverzeichnis; ein Server wird nur für clone, push und pull gebraucht. AmiVCS ist kein Git-Nachbau: Es übernimmt bewährte Grundideen (Commit, Tree und Blob, Branches, dateiweises Vormerken, 3-Wege-Merge), verzichtet aber bewusst auf Rebase, Cherry-Pick, Stash, Reflog und Ähnliches. Ziel ist ein System, das auf einem 68020 ohne FPU flüssig läuft und das man komplett verstehen kann.

  PC-Client (libcurl)  ─┐   HTTPS   ┌──────────────────────────────────┐
                        ├──────────►│ Webserver + PHP (server/)        │
  Amiga-Client (AmiSSL)─┘           │  api.php  Objekt-/Ref-Speicher   │
          │                         │  web.php  nur lesende Ansicht    │
          │ lokal, ohne Server      │  MariaDB  Benutzer, Repos, Refs  │
          ▼                         │  Storage  Objekte als Dateien    │
  Arbeitsverzeichnis + .amivcs/     └──────────────────────────────────┘
  init · add · commit · log · branch · switch · merge · gc
BestandteilPlattformZweck
amivcsAmiga + PCKommandozeilen-Client, alle Befehle
amivcs-guiAmiga (MUI) / PC (Qt 6)Oberfläche im Stil von „git gui“
AmiVCSConfigAmigaEinstellungen: Name/E-Mail für die Commits, Remote-URL und Benutzer pro Repository
Server (server/)Webserverspeichert nur Objekte und Branch-Zeiger; dazu eine nur lesende Web-Oberfläche

Jedes Repository ist ein ganz normales Verzeichnis. AmiVCS legt darin das Unterverzeichnis .amivcs und die Datei .amivcsignore an; alles andere gehört Ihnen. AmiVCS ist von AmiCloud vollständig getrennt: eigener Server, eigene Datenbank, eigene Konfiguration, eigene Zugangsdaten.

Inhalt

  1. Voraussetzungen
  2. Installation auf dem Amiga
  3. Installation auf dem PC
  4. Konfiguration
  5. AmiVCSConfig
  6. amivcs – Aufruf und Optionen
  7. amivcs – lokale Befehle
  8. amivcs – Server-Befehle
  9. amivcs-gui (MUI, Amiga)
  10. amivcs-gui (Qt, PC)
  11. Typischer Arbeitsablauf
  12. Konflikte auflösen
  13. .amivcsignore
  14. Objektmodell und Grenzen
  15. Server einrichten
  16. Web-Oberfläche
  17. Server-API
  18. Fehlersuche
  19. Bauen aus den Quellen
  20. Lizenz, Autor, Versionen

1. Voraussetzungen

WasWofür
AmigaOS 3.x, 68020 oder besseralle Amiga-Programme (keine FPU nötig)
TCP/IP-Stack mit bsdsocket.library (z. B. Roadshow, AmiTCP, Miami)clone/push/pull in amivcs und amivcs-gui
AmiSSL 5 (amisslmaster.library)wie oben – alle Verbindungen laufen über HTTPS
MUI 3.8 oder neuer (muimaster.library ≥ 19)nur amivcs-gui auf dem Amiga
Intuition/GadTools (im Betriebssystem)AmiVCSConfig
optional: codesets.library ab Version 6 (Aminet util/libs/codesets)Umlaute in Dateinamen, Autor und Commit-Text bei anderen Zeichensätzen als ISO-8859-1 (fehlt sie, gilt ISO-8859-1). Im Repository steht alles in UTF-8, damit Amiga und PC dieselben Namen sehen.
PC: libcurl; für die Oberfläche Qt 6amivcs bzw. amivcs-gui auf macOS/Linux/Windows
Lokal ohne Netzwerk – wie git
amivcs und amivcs-gui öffnen Netzwerk und AmiSSL erst bei clone, push oder pull; alles andere funktioniert ohne TCP/IP-Stack. Fehlt dann etwas, meldet amivcs-gui die Ursache in einem Requester (z. B. cannot open bsdsocket.library) und bleibt geöffnet.

Stack: Alle Amiga-Programme fordern selbst 64 KB Stack an; der Startcode von vbcc legt bei Bedarf einen größeren Stack an. Ein vorheriges Stack ist nicht nötig.

2. Installation auf dem Amiga

Das Archiv AmiVCS.lha (Aminet, dev/misc) enthält die Schublade AmiVCS:

Der Installer von AmiVCS.
AmigaDer Installer von AmiVCS.
AmiVCS/
  Install-AmiVCS     Installationsskript (Commodore-Installer)
  Install-AmiVCS.shell  dasselbe als Shell-Skript
  Uninstall-AmiVCS   Deinstallationsskript
  ReadMe             Kurzbeschreibung
  LICENSE            Lizenztext (GPLv3)
  THIRD-PARTY-NOTICES  Lizenz der Fremdkomponente Parson (MIT)
  C/                 amivcs, amivcs-gui, AmiVCSConfig
  Docs/              AmiVCS.guide
  Examples/          config.example

Archiv auspacken, z. B. lha x AmiVCS.lha RAM:.

Alle Teile haben Workbench-Icons. Zum Installieren in der Schublade das Icon Install-AmiVCS doppelt anklicken. Es startet den Commodore-Installer (bei AmigaOS 3.2 in SYS:System, bei älteren Systemen von der Install-Diskette nach C: kopieren). Ohne Installer gibt es dasselbe als Shell-Skript:

CD RAM:AmiVCS
Execute Install-AmiVCS.shell

Wer den Installer aus der Shell startet, wechselt vorher mit CD in die Schublade: Das Skript sucht seine Dateien relativ zum aktuellen Verzeichnis. Von einem anderen Verzeichnis aus bricht es mit einem Hinweis ab.

Aktualisieren: Eine neuere Version installiert man genauso – Archiv auspacken, Installer erneut starten. Er vergleicht bei jedem Programm die installierte Version mit der im Archiv. Als Einsteiger oder Geübter Benutzer ersetzt er gleiche und ältere Versionen; eine neuere installierte Version bleibt stehen und wird am Ende genannt. Im Expertenmodus zeigt er bei jedem schon installierten Programm beide Versionen und fragt. Vorhandene Icons (mit eigenen Tooltypes und Positionen) bleiben erhalten. Die Shell-Variante fragt nur nach, wenn ein installiertes Programm neuer ist als das im Archiv.

Das Skript fragt, welche Teile installiert werden sollen (im Installer per Auswahlliste, im Shell-Skript mit y oder n): amivcs und amivcs-gui nach C:, AmiVCSConfig nach SYS:Prefs/ (ein altes AMIVCSPrefs wird dabei entfernt), das AmigaGuide-Handbuch nach HELP: (nur wenn der Assign existiert). Es warnt, wenn muimaster.library oder amisslmaster.library in LIBS: fehlen, und bietet am Ende an, AmiVCSConfig zu starten, falls es noch keine ENVARC:AmiVCS/config gibt (Name und E-Mail für die Commits). Vorhandene Konfigurationen werden nie überschrieben. Es wird kein DOS-Treiber installiert und nichts gemountet – AmiVCS enthält keinen Handler.

Manuelle Installation

Datei aus der SchubladeZiel
C/amivcsC:
C/amivcs-guiC: (oder eine beliebige Schublade)
C/AmiVCSConfigSYS:Prefs/
Docs/AmiVCS.guideHELP: (oder beliebig)
Examples/config.exampleVorlage für ENVARC:AmiVCS/config

Es werden keine Icons mitgeliefert. AmiVCSConfig startet man im Shell mit SYS:Prefs/AmiVCSConfig [<repository>]; auf der Workbench ist es nur sichtbar, wenn im Fenster „Alle Dateien anzeigen“ eingeschaltet ist. Für amivcs-gui kann ein Projekt-Icon angelegt werden; es versteht die Merkmale (Tooltypes) REPO=<pfad> und DEBUG.

Deinstallation

Execute Uninstall-AmiVCS aus der Schublade löscht C:amivcs, C:amivcs-gui, SYS:Prefs/AmiVCSConfig und HELP:AmiVCS.guide und fragt, ob auch die Einstellungen ENV:AmiVCS und ENVARC:AmiVCS entfernt werden sollen. Ihre Repositories bleiben unberührt.

3. Installation auf dem PC

Auf macOS, Linux und Windows werden die Programme aus den Quellen gebaut (Kapitel 19) und installiert:

make pc                 # bin/pc/amivcs
make qt                 # bin/pc/amivcs-gui
sudo make install       # nach /usr/local/bin (PREFIX=..., DESTDIR=... möglich)

4. Konfiguration

Wie bei git gibt es zwei Ebenen: globale Vorgaben für alle Repositories und die Einstellungen eines Repositorys. Beides sind einfache Textdateien, eine Einstellung pro Zeile als schlüssel=wert, Zeilen mit # am Anfang sind Kommentare. Eigene Dateien, nicht amicloud.cfg.

Globale Vorgaben

SystemDatei
AmigaENV:AmiVCS/config (aktiv), ENVARC:AmiVCS/config (dauerhaft)
macOS/Linux~/.amivcsconfig
Windows%USERPROFILE%\.amivcsconfig
name=Vorname Nachname
email=name@example.org
#verify_ssl=1
#timeout=120
SchlüsselBedeutung
nameAutor Ihrer Commits (wie user.name bei git). Ohne Namen lehnt amivcs commit ab; die Oberflächen fragen einmal danach
emailE-Mail des Autors; der Autor erscheint als Name <email>
verify_ssl1 = Zertifikat prüfen (Standard), 0 = nicht prüfen, nur zum Testen
timeoutNetz-Timeout in Sekunden (Standard 120): so lange darf eine Verbindung ganz ohne Datenfluss bleiben. Die Dauer von clone, push oder pull ist nie begrenzt.

Pro Repository: .amivcs/config

remote=https://amivcs.example.com/meinprojekt
user=bob
pass=geheim
SchlüsselBedeutung
remoteRemote-URL wie bei git: alles vor dem letzten / ist der Server (dort liegt api.php), dahinter der Name des Repositorys auf dem Server. Jedes Repository kann auf einen anderen Server zeigen. Auf dem Amiga nur https://
userBenutzername an diesem Server
passPasswort – nur wenn beim Login „Passwort merken“ gewählt wurde, im Klartext. Am besten ein App-Passwort aus der Web-Oberfläche
name, emailAutor nur für dieses Repository (fehlt er, gilt die globale Vorgabe)

Rein lokal braucht AmiVCS nur einen Namen. clone und push <url> merken sich die Remote-URL; fehlen Benutzer oder Passwort oder meldet der Server „falsches Passwort“, fragen amivcs (im Shell-Fenster, das Passwort ohne Echo), amivcs-gui und die AmigaIDE danach und bieten an, das Passwort zu merken. Gesetzt und gelesen werden alle Werte auch mit amivcs config und amivcs remote (Kapitel 8); den Autor für einen einzelnen Aufruf ändert amivcs --author "Ronny" commit -a -m "Text".

Bis Version 0.9 gab es stattdessen eine einzige amivcs.cfg mit server=, user= und pass=; sie wird nicht mehr gelesen. Für ein schon vorhandenes Repository genügt einmal amivcs remote https://server/name.

5. AmiVCSConfig Amiga

Einstellungen im Stil der Workbench-Voreinsteller, Aufruf SYS:Prefs/AmiVCSConfig [<repository>]. Das Repository ist das Argument, das Merkmal REPO= des Icons oder das aktuelle Verzeichnis; amivcs-gui (Repository > Settings...) und die AmigaIDE starten es mit dem geöffneten Repository.

AmiVCSConfig: Name und E-Mail für alle Repositories, Remote-URL und Benutzer für dieses.
AmigaAmiVCSConfig: Name und E-Mail für alle Repositories, Remote-URL und Benutzer für dieses.
BereichFelder
Vorgaben für alle RepositoriesName, E-Mail
RepositoryRemote-URL, Benutzer (Server), Name und E-Mail nur für dieses Repository (leer = Vorgabe), Passwort vergessen (nur wenn eins gemerkt ist)

Speichern schreibt ENV: und ENVARC:AmiVCS/config sowie .amivcs/config des Repositorys, Abbrechen schreibt nichts. Ein „Benutzen“ gibt es nicht mehr. Die Fensterposition wird gemerkt.

6. amivcs – Aufruf und Optionen Amiga + PC

amivcs [--author <name>] <befehl> [argumente]
Option (vor dem Befehl)Bedeutung
--author <name>Commit-Autor für diesen Aufruf
--args-from <datei>weitere Argumente aus einer Datei, eines pro Zeile (Pfade, Branch-Namen); \, Tab und Zeilenumbruch als \\, \t, \n. Spart Quoting auf der AmigaDOS-Kommandozeile
--porcelain-out <datei>Ergebnis zusätzlich maschinenlesbar in eine Datei, für Programme wie AmigaIDE (siehe unten)
Immer im Wurzelverzeichnis aufrufen
amivcs muss im Wurzelverzeichnis des Repositorys (dort, wo .amivcs liegt) aufgerufen werden. Anders als Git wird nicht in übergeordneten Verzeichnissen gesucht. Ausnahmen: init und clone. Pfade bei add/unstage sind relativ zum Repository, z. B. src/main.c.

Ohne oder mit unbekanntem Befehl zeigt amivcs eine kurze Hilfe. Rückgabewert 0 bei Erfolg, sonst ungleich 0.

7. amivcs – lokale Befehle

BefehlWirkung
initNeues Repository im aktuellen Verzeichnis: .amivcs, Branch main (noch ohne Commit), .amivcsignore mit Standardmustern (falls noch keine da ist)
status„Changes to be committed“ (vorgemerkt) und „Changes not staged for commit“, jeweils mit new/modified/deleted
add <pfad>…Dateien oder Verzeichnisse (rekursiv) vormerken; ein ausdrücklich genannter Pfad wird auch vorgemerkt, wenn er einem Ignoriermuster entspricht. Eine gelöschte Datei (oder ein Verzeichnis mit gelöschten Dateien) merkt das Löschen vor
add -Aalle Änderungen vormerken (neu, geändert, gelöscht)
unstage <pfad>…Vormerkung zurücknehmen: der Eintrag kehrt zum Stand des letzten Commits zurück (bei neuen Dateien fällt er weg); die Datei bleibt unverändert. remove ist der alte Name dafür
commit -m <text> [-a]Vorgemerktes als Commit speichern; -a/--all merkt vorher alles vor. Ohne add und ohne -a gibt es nichts zu committen
commit -F <datei> [-a]wie oben, die Nachricht steht in der Datei (auch mehrzeilig)
log [--all] [-n N]Historie des aktuellen Branches (ID, Autor, Datum in UTC, Nachricht); folgt bei Merges nur dem ersten Elternteil. --all und -n wirken mit --porcelain-out
branchalle Branches, der aktuelle mit *
branch <name>neuen Branch auf dem aktuellen Commit anlegen (ohne zu wechseln); erst nach dem ersten Commit möglich. Umlaute und Zeichen wie & + # sind erlaubt, nicht aber Leerzeichen, ~ ^ : ? * [ \ und ..; der Name darf nicht mit / - . beginnen, nicht mit / . oder .lock enden und höchstens 100 Byte lang sein (wie beim Server)
switch <branch>Branch wechseln und Arbeitsverzeichnis anpassen; verweigert bei vorgemerkten oder ungesicherten Änderungen an versionierten Dateien. Nicht versionierte Dateien bleiben unberührt; liegt eine davon dort, wo der Ziel-Branch eine Datei schreiben würde, wird verweigert, bevor etwas geschrieben wird
checkoutversionierte Dateien auf den Stand des aktuellen Commits bringen (z. B. versehentlich gelöschte zurückholen); verweigert bei ungesicherten Änderungen
merge <branch>zusammenführen: „Already up to date“, „Fast-forward“ oder 3-Wege-Merge mit Merge-Commit; Konflikte siehe Kapitel 12
gclose Objekte in eine Pack-Datei packen („packed N object(s)“)
cat-file <oid>Typ und Größe eines Objekts (Fehlersuche; 32-stellige Hex-ID)
versionVersion ausgeben

Ändernde Befehle legen für ihre Dauer .amivcs/lock an. Läuft schon ein anderes Programm (z. B. AmigaIDE oder ein zweites amivcs), meldet amivcs das und ändert nichts. Bleibt die Datei nach einem Absturz liegen, kann man sie löschen.

Ausgabe für Programme (--porcelain-out): eine Zeile je Datensatz, Felder durch Tab getrennt, Text im lokalen Zeichensatz, \/Tab/Zeilenumbruch maskiert wie bei --args-from. Datensätze: format 1, branch <name> bzw. detached <id>, change S|U N|M|D <pfad>, ref *|- <name>, commit <id> <eltern> <zeit> <autor> <refs> <nachricht> (Zeit in UTC-Sekunden, Listen mit Komma), committed <id>, msg info|warn|error <text>, progress <fertig> <gesamt> <was>, auth-required <url> <benutzer> (Benutzer oder Passwort fehlen bzw. wurden abgelehnt), zuletzt immer end <rückgabewert>. Ändernde Befehle hängen den neuen Status an. Zugangsdaten übergibt ein Programm nie auf der Kommandozeile, sondern über --args-from als --user, --password und --remember-password.

8. amivcs – Server-Befehle

Brauchen eine Remote-URL wie https://amivcs.example.com/projekt (auf dem Amiga außerdem TCP/IP-Stack und AmiSSL). Benutzer und Passwort fragt amivcs im Shell-Fenster, wenn sie fehlen oder der Server sie ablehnt – das Passwort ohne Echo, danach „merken? (j/n)“. Der Fortschritt wird laufend angezeigt.

BefehlWirkung
clone <url> [verz]holt das Server-Repository in ein neues Verzeichnis (Standard: Name aus der URL, wie bei git), legt alle Branches an, checkt main aus (sonst den ersten Branch) und merkt sich URL und Benutzer in .amivcs/config. Ein abgebrochener clone wird mit demselben Aufruf fortgesetzt.
push [<url>]lädt den aktuellen Branch hoch (nur fehlende Objekte, dann den Branch-Zeiger). Mit <url> wird diese Adresse benutzt, als Remote gemerkt; ohne gilt die gemerkte. Fehlt das Repository auf dem Server noch, legt push es an – auch wenn die URL vorher mit amivcs remote oder AmiVCSConfig gesetzt wurde
pull [<url>] [<branch>]holt den Branch (Standard: gleichnamig zum aktuellen) und führt ihn wie merge zusammen
remote [<url>]zeigt bzw. setzt die Remote-URL dieses Repositorys
configzeigt alle Werte (global und dieses Repository; ein gemerktes Passwort verdeckt)
config [--global] <schlüssel> [<wert>]liest bzw. setzt einen Wert: name, email (mit --global die Vorgabe, sonst nur dieses Repository), remote, user, pass (nur Repository); global außerdem verify_ssl, timeout
config [--global] --unset <schlüssel>entfernt einen Wert; config --unset pass vergisst das gemerkte Passwort

Über eine langsame oder wacklige Leitung (Modem): Scheitert eine einzelne Anfrage an der Verbindung, versucht amivcs sie bis zu zweimal neu. Ctrl-C bricht clone, push und pull ab; pull und push lassen sich danach einfach wiederholen, clone setzt fort.

Repository-Namen (der letzte Teil der URL): Buchstaben, Ziffern, _, ., -, höchstens 128 Zeichen. Jeder Benutzer sieht nur seine eigenen Repositories.

push überschreibt nie fremde Commits
Hat jemand vor Ihnen gepusht, lehnt push ab: rejected -- the server has commits you don't have; pull and merge first. Dann amivcs pull, ggf. Konflikte lösen, erneut amivcs push. Der Server selbst prüft nur per Compare-and-Swap, ob sich der Branch zwischenzeitlich geändert hat.
# Amiga
amivcs config --global name "Ronny"
amivcs init
amivcs commit -a -m "Start"
amivcs push https://amivcs.example.com/projekt-x   # legt projekt-x an

# PC
amivcs clone https://amivcs.example.com/projekt-x
cd projekt-x
amivcs commit -a -m "Vom PC"
amivcs push

# Amiga
amivcs pull

9. amivcs-gui (MUI) Amiga

amivcs-gui [-v] [<pfad>]
amivcs-gui auf dem Amiga (MUI).
Amigaamivcs-gui auf dem Amiga (MUI).

<pfad> ist das zu öffnende Repository (Standard: aktuelles Verzeichnis), -v gibt Fehlermeldungen im Shell-Fenster aus. Von der Workbench aus übernehmen die Merkmale REPO=<pfad> und DEBUG diese Aufgaben. Ist das Verzeichnis noch kein Repository, bietet amivcs-gui an, eines anzulegen (auch: Menü Repository > Init Repository Here).

Das Fenster ist wie „git gui“ aufgebaut:

Switch und Merge zeigen zuerst die vorhandenen Branches an, danach wird der Name eingetippt. Die Kopfzeile zeigt die Remote-URL des Repositorys.

Während der Übertragung erscheint ein Fenster „Working...“ mit Abbrechen-Knopf. Alle Fenster merken sich ihre Position.

10. amivcs-gui (Qt) PC

amivcs-gui [<pfad>]      # außerdem --help, --version
amivcs-gui auf dem Mac (Qt) mit grafischem Commit-Graphen.
Macamivcs-gui auf dem Mac (Qt) mit grafischem Commit-Graphen.
Einen neuen Branch anlegen.
MacEinen neuen Branch anlegen.

Dieselbe Oberfläche für macOS, Linux und Windows, ebenso wie „git gui“ aufgebaut (Reiter Changes mit Listen, Dateivorschau, Knöpfen und Nachrichtenfeld; Reiter History); globale Vorgaben in ~/.amivcsconfig. Die Teiler lassen sich verschieben. Unterschiede zur MUI-Fassung:

11. Typischer Arbeitsablauf

# allein und nur lokal
cd meinprojekt
amivcs init
amivcs commit -a -m "Erster Stand"
amivcs branch experiment
amivcs switch experiment
# ... Dateien ändern ...
amivcs status
amivcs add -A
amivcs commit -m "Experiment"
amivcs switch main
amivcs merge experiment
amivcs log

# mit Server: einmal verknüpfen, danach nur noch pull/push
amivcs push https://amivcs.example.com/meinprojekt
amivcs pull
amivcs push

# auf einem zweiten Rechner
amivcs clone https://amivcs.example.com/meinprojekt

# ab und zu aufräumen
amivcs gc

12. Konflikte auflösen

merge und pull arbeiten dateiweise. Haben beide Seiten dieselbe Datei unterschiedlich geändert (oder eine Seite geändert, die andere gelöscht), ist das ein Konflikt. AmiVCS löst Konflikte nie automatisch:

Nur ein konfliktfreier Merge verbindet die Historien
Nur ein konfliktfreies merge/pull erzeugt einen Merge-Commit mit zwei Eltern. Ein von Hand „gelöster“ Commit hat nur einen Elternteil – ein erneutes merge/pull meldet denselben Konflikt dann wieder, und push wird weiter abgelehnt.

Bewährter Weg (Amiga-Befehle; auf dem PC entsprechend cp/rm):

; 1. eigene Fassung sichern, die der Gegenseite übernehmen
Copy datei datei.mine
Copy datei.theirs datei
Delete datei.theirs
; 2. committen und erneut zusammenführen -> "Merge completed."
amivcs commit -a -m "Stand der Gegenseite übernommen"
amivcs merge <branch>          ; bzw. amivcs pull
; 3. eigene Änderungen aus datei.mine einarbeiten, datei.mine löschen
amivcs commit -a -m "Konflikt aufgelöst"
; 4. ggf. amivcs push

Merge-Commits tragen den Autor amivcs und die Nachricht Merge branch '<name>'. merge, pull, switch und checkout verweigern die Arbeit, solange es ungesicherte Änderungen gibt.

13. .amivcsignore

Die Datei im Wurzelverzeichnis listet, was nicht versioniert werden soll. amivcs init legt sie so an:

# AMIVCS default ignore patterns
.amivcs/
#?.o
#?.lib
bin/
obj/

status, commit, checkout und ein rekursives add <verzeichnis> beachten die Muster; ein ausdrücklich genannter Pfad wird trotzdem vorgemerkt. Beim Branch-Wechsel bleiben ignorierte Dateien stehen.

14. Objektmodell und Grenzen

Objekte sind kompakt binär kodiert, ohne Gleitkommazahlen (Zeitstempel sind ganze Sekunden in UTC) und ohne Kompression.

ObjektInhalt
Blobrohe Dateibytes; OID = MD5 des Inhalts (32 Hex-Zeichen), gleicher Inhalt wird nur einmal gespeichert
Treeeine Verzeichnisebene: sortierte Liste aus Name, Typ, OID
CommitTree-OID, 0–2 Eltern, Zeitstempel, Autor, Nachricht
BranchName + Commit-OID; alle Branches in einer Datei packed-refs (spart Verzeichniseinträge auf FFS)
.amivcs/
  HEAD               aktueller Branch
  packed-refs        alle Branches
  index              Vormerkungen (die OID eines Trees)
  config             Remote-URL, Benutzer, ggf. Passwort, Name/E-Mail
  objects/<2>/<30>   lose Objekte
  objects/pack/      Pack-Dateien aus "amivcs gc"

Bewusste Grenzen der Version 1:

15. Server einrichten

Der Server liegt dem Archiv als Schublade Server bei und läuft auf einem gewöhnlichen Webserver: PHP ≥ 7.4 mit pdo_mysql und mbstring, MariaDB oder MySQL, HTTPS-Zertifikat. Er gehört in die Wurzel eines eigenen vHosts (web.php leitet auf /web.php um). Die ausführliche Schritt-für-Schritt-Anleitung steht in INSTALL.md im Server-Paket; Kurzfassung für AlmaLinux/RHEL mit Apache:

# vHost amivcs.example.com mit DocumentRoot /var/www/amivcs,
# AllowOverride All; dann HTTPS:
sudo certbot --apache -d amivcs.example.com

sudo mkdir -p /var/www/amivcs /var/amivcs-storage
sudo cp -r server/. /var/www/amivcs/          # inkl. .htaccess
sudo cp /var/www/amivcs/config.php.example /var/www/amivcs/config.php
sudo nano /var/www/amivcs/config.php
sudo chown -R apache:apache /var/www/amivcs /var/amivcs-storage
sudo chmod 750 /var/amivcs-storage

sudo mysql < /var/www/amivcs/sql/schema.sql
sudo mysql -e "CREATE USER 'amivcs'@'localhost' IDENTIFIED BY 'geheim';
  GRANT SELECT, INSERT, UPDATE, DELETE ON amivcs.* TO 'amivcs'@'localhost';"

cd /var/www/amivcs
sudo -u apache php bin/amivcs-admin.php user:add --admin bob

sudo systemctl reload httpd
curl -u bob:geheim "https://amivcs.example.com/api.php?action=status"
# -> {"status":"ok","version":"0.1"}
Konstante in config.phpBedeutung
AMIVCS_DB_HOST, AMIVCS_DB_NAME, AMIVCS_DB_USER, AMIVCS_DB_PASSDatenbankzugang (eigene Datenbank amivcs)
AMIVCS_STORAGE_PATHObjektspeicher, außerhalb des Web-Roots; Objekte unter <pfad>/<benutzer>/<repo>/objects/<2>/<30>
AMIVCS_MAX_UPLOADgrößtes Objekt in Bytes (Standard 100 MB); post_max_size in php.ini passend setzen
AMIVCS_ALLOW_HTTPnur für lokale Tests (php -S): erlaubt Klartext-HTTP – nie in Produktion

Die Clients brauchen dann nur noch die Remote-URL eines Repositorys, z. B. https://amivcs.example.com/projekt. Repositories entstehen beim ersten amivcs push <url> oder in der Web-Oberfläche. Weitere Benutzer legt der Administrator in der Web-Oberfläche an. Datensicherung: Datenbank und Speicherverzeichnis gemeinsam sichern.

16. Web-Oberfläche Browser

Unter https://amivcs.example.com/ (Adresse Ihres Servers) bedient sich AmiVCS im Browser ähnlich wie Gitea: Anmeldung mit denselben Zugangsdaten wie beim Login der Clients. Der Dialog Klonen eines Repositorys zeigt die fertige Zeile amivcs clone https://…/<name>.

Die eigenen Repositories in der Weboberfläche.
BrowserDie eigenen Repositories in der Weboberfläche.
Dateibaum und README eines Repositorys.
BrowserDateibaum und README eines Repositorys.
Dateiansicht mit Zeilennummern.
BrowserDateiansicht mit Zeilennummern.
Die Historie mit Commit-Graph.
BrowserDie Historie mit Commit-Graph.
Ein Commit mit den zeilenweisen Änderungen.
BrowserEin Commit mit den zeilenweisen Änderungen.
Die Branches eines Repositorys.
BrowserDie Branches eines Repositorys.
Einstellungen eines Repositorys: Beschreibung, öffentlich oder privat, Löschen.
BrowserEinstellungen eines Repositorys: Beschreibung, öffentlich oder privat, Löschen.
Persönliche Einstellungen mit den App-Passwörtern.
BrowserPersönliche Einstellungen mit den App-Passwörtern.

Öffentliche Repositories sieht jeder, auch ohne Konto (Startseite und Entdecken); private sind für alle anderen unsichtbar. Klonen, Push und Pull bleiben immer dem Eigentümer vorbehalten. Neue Commits entstehen nur auf dem Client – im Browser wird nichts geändert außer den Repository-Einstellungen.

17. Server-API

https://<host>/api.php?action=…, HTTP-Basic-Auth bei jeder Anfrage (Kontopasswort oder App-Passwort; nach 5 Fehlversuchen 15 Minuten Sperre mit 429). Antworten: {"status":"ok",…} bzw. {"status":"error","code":N,"message":"…"}; get-object liefert die Rohdaten.

AktionBedeutung
statusVersion/Erreichbarkeit
create-repo&repo=Repository für den angemeldeten Benutzer anlegen (409, falls vorhanden)
refs&repo=alle Branches (Name + OID)
has&repo=&oids=welche der kommagetrennten OIDs schon vorhanden sind
put-object&repo=&oid=&type=Objekt hochladen (POST, Body = Rohbytes); 422, wenn der Inhalt nicht zur OID passt, 413 bei Übergröße
get-object&repo=&oid=Objekt herunterladen (Header X-Amivcs-Type)
update-ref&repo=&name=&old=&new=Branch per Compare-and-Swap setzen; 409, wenn old nicht mehr stimmt

18. Fehlersuche

Meldung / SymptomUrsache und Abhilfe
not an AMIVCS repository (no .amivcs/ here -- run from the repo root)im Wurzelverzeichnis des Repositorys aufrufen
init failed (already a repository here?)es gibt schon ein .amivcs
working tree has uncommitted changes -- commit firstswitch/checkout/merge/pull überschreiben keine ungesicherte Arbeit: amivcs status, committen, erneut versuchen
commit ohne Wirkungvorher amivcs add … oder commit -a
cannot branch -- no commits yetBranches erst nach dem ersten Commit
who are you? Set your name firstnoch kein Name für die Commits: amivcs config --global name "…" (oder AmiVCSConfig, Kapitel 4)
no remote URL seteinmal amivcs push <url> oder amivcs remote <url> aufrufen
… is not a repository URL (https://server/<name>)die Adresse braucht Schema, Server und den Namen des Repositorys, z. B. https://amivcs.example.com/projekt
login refused … -- wrong user or passwordBenutzer oder Passwort falsch; amivcs fragt neu. Ein falsch gemerktes Passwort vergisst amivcs config --unset pass
rejected -- the server has commits you don't have; pull and merge firstjemand hat vorher gepusht: amivcs pull, ggf. Konflikte lösen, erneut push
network error, retrying / clone bricht abDie Leitung ist abgerissen oder hing länger als timeout Sekunden (Standard 120) ohne Daten. amivcs versucht jede Anfrage bis zu dreimal; bei sehr langsamen Leitungen timeout=300 setzen. Einen abgebrochenen clone mit demselben Aufruf fortsetzen.
... would be one file here (bei clone, switch, merge)Zwei Namen im Repository wären auf diesem Rechner dieselbe Datei: sie unterscheiden sich nur in Groß-/Kleinschreibung (README und Readme, auch Äpfel und äpfel), oder beide enthalten ein Zeichen, das der lokale Zeichensatz nicht kennt. Es wird nichts geschrieben; ein clone wird ganz zurückgenommen (ein neu angelegtes Verzeichnis verschwindet wieder). Einen der beiden Namen auf einem System umbenennen, das sie unterscheidet (z. B. Linux), pushen und erneut klonen.
network error, Meldungen zu bsdsocket.library/AmiSSLTCP/IP-Stack online? AmiSSL 5 installiert? Auf dem Amiga nur https://. Diese Meldungen der gemeinsamen HTTP-Bibliothek beginnen mit amicloudcore:
HTTP 401Benutzer/Passwort falsch oder Konto gesperrt
ZertifikatsfehlerZertifikat des Servers prüfen; verify_ssl=0 nur zum Testen
amivcs-gui startet nicht (Amiga)MUI 3.8 oder neuer fehlt; der Requester nennt den Grund
Clone/Push/Pull in amivcs-gui: Network initialisation failedTCP/IP-Stack starten bzw. AmiSSL 5 installieren; das Fenster bleibt offen, der nächste Versuch initialisiert das Netzwerk erneut; amivcs-gui -v im Shell zeigt Einzelheiten
HTTPS required vom Serverper http:// statt https:// aufgerufen

19. Bauen aus den Quellen

Die Quellen liegen auf GitHub: github.com/dangelrk/AmiVCS; die Amiga-Programme gibt es auch als Archiv auf Aminet.

git clone --recurse-submodules https://github.com/dangelrk/AmiVCS.git
cd AmiVCS
make pc                       # amivcs für den PC
make qt                       # amivcs-gui (Qt 6)
export VBCC=/pfad/zu/vbcc
make amiga                    # Amiga-Programme per vbcc
make dist-amiga               # Installationsschublade build/dist/AmiVCS/

Nativ auf dem Amiga (vbcc, NDK 3.2, AmiSSL-, Roadshow- und MUI-SDK): Execute Build-Amiga im Projektverzeichnis; die SDK-Pfade stehen oben im Skript. Build-Amiga wurde auf dem Host gegengeprüft, auf echter Hardware aber noch nicht getestet. Vollständige Anleitung: docs/BUILD.md.

20. Lizenz, Autor, Versionen

AmiVCS – Copyright © 2026 Ronny Krueger. Freie Software unter der GNU General Public License, Version 3 oder später (GPL-3.0-or-later): Sie dürfen AmiVCS benutzen, weitergeben und verändern; veränderte Fassungen müssen wieder unter der GPL stehen, mit Quelltext. Es gibt keine Gewährleistung. Maßgeblich ist der Lizenztext in LICENSE. Die in AmiCloudCore enthaltene JSON-Bibliothek Parson steht unter der MIT-Lizenz; ihr Wortlaut liegt als THIRD-PARTY-NOTICES in der Installationsschublade.

Fehlermeldungen und Wünsche: amitools@planet-rk.de · Quellen und Fehlerberichte: github.com/dangelrk/AmiVCS · Schwesterprojekte: AmiCloudCore, AmiCloud, AmiOwnCloud.

DatumÄnderung
08.11.2026Programmversion 0.10: Remote-URL pro Repository wie bei git (clone/push/pull <url>, remote), Benutzer und Passwort werden bei Bedarf gefragt und auf Wunsch im Repository gemerkt, Name und E-Mail des Autors wie bei git (config, global oder pro Repository, auch für Merge-Commits), commit ohne Namen lehnt ab; AmiVCSConfig ersetzt AMIVCSPrefs, amivcs.cfg wird nicht mehr gelesen; push legt ein fehlendes Repository auch bei vorher gesetzter URL an; amivcs-gui: Login-Fenster, Repository > Settings, Remote-URL in der Kopfzeile, Rescan liest den Arbeitsbaum wirklich neu ein, Fenster merken ihre Position
07.11.2026Programmversion 0.9: push lädt Branches mit Umlauten oder Zeichen wie & + # hoch (braucht den Server ab 0.9; vorher lehnte er sie ab, mit der irreführenden Meldung „pull and merge first“); branch lehnt Namen ab, die der Server nicht annimmt; Server: gleichzeitiges Hochladen desselben Objekts scheitert nicht mehr mit Fehler 500; Hinweis auf den experimentellen Status
07.11.2026Programmversion 0.8: Handbuch überarbeitet; der Installer meldet es jetzt, wenn er nicht aus seiner Schublade gestartet wird, statt mit „object in use“ abzubrechen
02.11.2026Programmversion 0.7: clone, switch und merge behandeln auch Äpfel/äpfel auf Amiga, macOS und Windows als dieselbe Datei; ein clone mit zwei solchen Namen wird ganz zurückgenommen, statt ein Repository ohne Dateien zu hinterlassen
02.11.2026Programmversion 0.6: Datei- und Branchnamen sowie Commit-Texte mit Umlauten (UTF-8 im Repository, codesets.library auf dem Amiga); unstage; add auf gelöschte Pfade; Branchwechsel und Merge wie bei git (nicht versionierte Dateien bleiben unangetastet, überschreiben wird abgelehnt); Sperrdatei gegen zwei gleichzeitige schreibende Aufrufe; Ctrl-C bricht Netzvorgänge ab; Schnittstelle für Programme (--porcelain-out, --args-from, commit -F, log --all -n), die die AmigaIDE nutzt; clone eines Repositorys mit eigener .amivcsignore scheiterte
01.11.2026Programmversion 0.5: wird eine Anmeldung abgelehnt, versucht AmiVCS es mit denselben Zugangsdaten 15 Minuten lang nicht erneut
01.11.2026Programmversion 0.4: der AmiVCS-Server liegt dem Amiga-Archiv bei (Schublade Server), gemeinsamer Kern aktualisiert
01.11.2026Programmversion 0.3: gemeinsamer Kern aktualisiert (Umlaute, JSON-Antworten unabhängig von der Spracheinstellung)
31.10.2026Programmversion 0.2: mindestens 68020 (AmiSSL 5 braucht ihn ohnehin), gemeinsamer Kern aktualisiert
23.10.2026langsame Verbindungen: timeout, Wiederholung fehlgeschlagener Anfragen, Fortsetzen eines abgebrochenen clone, Ctrl-C
27.09.2026eigenes Repository „AmiVCS“; Handbuch überarbeitet (Installation, Install-Skript, Konfiguration, Fehlersuche)
12.07.2026amivcs 0.1: init, status, commit, log, branch, switch, checkout, merge, gc, cat-file; Server; clone/push/pull
13.07.2026Vormerkbereich (add/remove/commit -a), Mehrbranch-Historie, amivcs-gui (Qt und MUI), Web-Oberfläche
14.07.2026.amivcsignore mit Pfadmustern; AMIVCSPrefs
15./16.07.2026Fehlerkorrekturen beim Speichern der Einstellungen unter AmigaOS