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.
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
| Bestandteil | Plattform | Zweck |
|---|---|---|
amivcs | Amiga + PC | Kommandozeilen-Client, alle Befehle |
amivcs-gui | Amiga (MUI) / PC (Qt 6) | Oberfläche im Stil von „git gui“ |
AmiVCSConfig | Amiga | Einstellungen: Name/E-Mail für die Commits, Remote-URL und Benutzer pro Repository |
Server (server/) | Webserver | speichert 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.
| Was | Wofür |
|---|---|
| AmigaOS 3.x, 68020 oder besser | alle 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 6 | amivcs bzw. amivcs-gui auf macOS/Linux/Windows |
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.
Das Archiv AmiVCS.lha (Aminet, dev/misc) enthält die Schublade
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.
| Datei aus der Schublade | Ziel |
|---|---|
C/amivcs | C: |
C/amivcs-gui | C: (oder eine beliebige Schublade) |
C/AmiVCSConfig | SYS:Prefs/ |
Docs/AmiVCS.guide | HELP: (oder beliebig) |
Examples/config.example | Vorlage 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.
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.
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)
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.
| System | Datei |
|---|---|
| Amiga | ENV: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üssel | Bedeutung |
|---|---|
name | Autor Ihrer Commits (wie user.name bei git). Ohne Namen lehnt amivcs commit ab; die Oberflächen fragen einmal danach |
email | E-Mail des Autors; der Autor erscheint als Name <email> |
verify_ssl | 1 = Zertifikat prüfen (Standard), 0 = nicht prüfen, nur zum Testen |
timeout | Netz-Timeout in Sekunden (Standard 120): so lange darf eine Verbindung ganz ohne Datenfluss bleiben. Die Dauer von clone, push oder pull ist nie begrenzt. |
remote=https://amivcs.example.com/meinprojekt user=bob pass=geheim
| Schlüssel | Bedeutung |
|---|---|
remote | Remote-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:// |
user | Benutzername an diesem Server |
pass | Passwort – nur wenn beim Login „Passwort merken“ gewählt wurde, im Klartext. Am besten ein App-Passwort aus der Web-Oberfläche |
name, email | Autor 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.
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.

| Bereich | Felder |
|---|---|
| Vorgaben für alle Repositories | Name, E-Mail |
| Repository | Remote-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.
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) |
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.
| Befehl | Wirkung |
|---|---|
init | Neues 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 -A | alle Ä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 |
branch | alle 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 |
checkout | versionierte 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 |
gc | lose Objekte in eine Pack-Datei packen („packed N object(s)“) |
cat-file <oid> | Typ und Größe eines Objekts (Fehlersuche; 32-stellige Hex-ID) |
version | Version 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.
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.
| Befehl | Wirkung |
|---|---|
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 |
config | zeigt 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 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
amivcs-gui [-v] [<pfad>]

<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:
| * , |/ ), Branch-Namen stehen in eckigen
Klammern vor der Nachricht. Darunter New Branch…,
Switch…, Merge…, Clone….Switch und Merge zeigen zuerst die vorhandenen Branches an, danach wird der Name eingetippt. Die Kopfzeile zeigt die Remote-URL des Repositorys.
https://server/name) und das lokale Verzeichnis.init angelegtes Repository wird so verknüpft..amivcs/config des Repositorys.Während der Übertragung erscheint ein Fenster „Working...“ mit Abbrechen-Knopf. Alle Fenster merken sich ihre Position.
amivcs-gui [<pfad>] # außerdem --help, --version


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:
# 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
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:
conflict: <pfad>.<pfad>.theirs.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.
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/
# am Zeilenanfang ist ein
Kommentar – außer bei #?, dem AmigaDOS-Joker.*/? und #?/?
auf allen Plattformen; auf dem Amiga zusätzlich die volle
AmigaDOS-Mustersprache./ am Ende: nur Verzeichnisse./ im Muster: gilt für den Dateinamen in jeder
Ebene (bin/ trifft jedes Verzeichnis namens bin)./ im Muster (/build,
docs/*.log, **/tmp/): an der Wurzel verankert,
Ebene für Ebene; * springt nie über /, ein
Segment ** steht für beliebig viele (auch null) Ebenen..amivcs wird immer ignoriert.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.
Objekte sind kompakt binär kodiert, ohne Gleitkommazahlen (Zeitstempel sind ganze Sekunden in UTC) und ohne Kompression.
| Objekt | Inhalt |
|---|---|
| Blob | rohe Dateibytes; OID = MD5 des Inhalts (32 Hex-Zeichen), gleicher Inhalt wird nur einmal gespeichert |
| Tree | eine Verzeichnisebene: sortierte Liste aus Name, Typ, OID |
| Commit | Tree-OID, 0–2 Eltern, Zeitstempel, Autor, Nachricht |
| Branch | Name + 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:
amivcs log zeigt nur die erste Elternlinie.AMIVCS_MAX_UPLOAD des Servers (Standard
100 MB).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.php | Bedeutung |
|---|---|
AMIVCS_DB_HOST, AMIVCS_DB_NAME, AMIVCS_DB_USER, AMIVCS_DB_PASS | Datenbankzugang (eigene Datenbank amivcs) |
AMIVCS_STORAGE_PATH | Objektspeicher, außerhalb des Web-Roots; Objekte unter <pfad>/<benutzer>/<repo>/objects/<2>/<30> |
AMIVCS_MAX_UPLOAD | größtes Objekt in Bytes (Standard 100 MB); post_max_size in php.ini passend setzen |
AMIVCS_ALLOW_HTTP | nur 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.
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>.








Ö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.
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.
| Aktion | Bedeutung |
|---|---|
status | Version/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 |
| Meldung / Symptom | Ursache 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 first | switch/checkout/merge/pull überschreiben keine ungesicherte Arbeit: amivcs status, committen, erneut versuchen |
| commit ohne Wirkung | vorher amivcs add … oder commit -a |
cannot branch -- no commits yet | Branches erst nach dem ersten Commit |
who are you? Set your name first | noch kein Name für die Commits: amivcs config --global name "…" (oder AmiVCSConfig, Kapitel 4) |
no remote URL set | einmal 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 password | Benutzer 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 first | jemand hat vorher gepusht: amivcs pull, ggf. Konflikte lösen, erneut push |
network error, retrying / clone bricht ab | Die 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/AmiSSL | TCP/IP-Stack online? AmiSSL 5 installiert? Auf dem Amiga nur https://. Diese Meldungen der gemeinsamen HTTP-Bibliothek beginnen mit amicloudcore: |
| HTTP 401 | Benutzer/Passwort falsch oder Konto gesperrt |
| Zertifikatsfehler | Zertifikat 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 failed | TCP/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 Server | per http:// statt https:// aufgerufen |
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.
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.2026 | Programmversion 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.2026 | Programmversion 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.2026 | Programmversion 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.2026 | Programmversion 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.2026 | Programmversion 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.2026 | Programmversion 0.5: wird eine Anmeldung abgelehnt, versucht AmiVCS es mit denselben Zugangsdaten 15 Minuten lang nicht erneut |
| 01.11.2026 | Programmversion 0.4: der AmiVCS-Server liegt dem Amiga-Archiv bei (Schublade Server), gemeinsamer Kern aktualisiert |
| 01.11.2026 | Programmversion 0.3: gemeinsamer Kern aktualisiert (Umlaute, JSON-Antworten unabhängig von der Spracheinstellung) |
| 31.10.2026 | Programmversion 0.2: mindestens 68020 (AmiSSL 5 braucht ihn ohnehin), gemeinsamer Kern aktualisiert |
| 23.10.2026 | langsame Verbindungen: timeout, Wiederholung fehlgeschlagener Anfragen, Fortsetzen eines abgebrochenen clone, Ctrl-C |
| 27.09.2026 | eigenes Repository „AmiVCS“; Handbuch überarbeitet (Installation, Install-Skript, Konfiguration, Fehlersuche) |
| 12.07.2026 | amivcs 0.1: init, status, commit, log, branch, switch, checkout, merge, gc, cat-file; Server; clone/push/pull |
| 13.07.2026 | Vormerkbereich (add/remove/commit -a), Mehrbranch-Historie, amivcs-gui (Qt und MUI), Web-Oberfläche |
| 14.07.2026 | .amivcsignore mit Pfadmustern; AMIVCSPrefs |
| 15./16.07.2026 | Fehlerkorrekturen beim Speichern der Einstellungen unter AmigaOS |