## Einführung
Heutzutage ist Git ein standard im Portfolio jedes Software Entwicklers. Dies liegt hauptsächlich an der weiten Verbreitung des Tools in Kommerziellen Projekten. Viele sehen Git also als ein Wundertool, da sie ausserhalb von (vielleicht ein paar) proprietären Tools nie etwas vergleichbares gesehen haben. Es gibt jedoch durchaus Alternativen die als Versionskontrollsystem genutzt werden können.
In diesem Blog möchte ich genauer auf eine dieser Alternativen eingehen: Fossil.
Fossil ist ein in sich geschlossenes C Program welches entweder als Binary heruntergeladen oder individuell kompiliert werden kann.
Es wurde 2006 von D. Richard Hipp unter der BSD Lizenz veröffentlicht und bietet sowohl ein Versionskontrollsystem wie auch eine Wiki Software an.
### Der grundlegende Workflow
Bei Git wird die Versionsverwaltung bekanntlich in Form von Dateien im .git Ordner gespeichert. Fossil speichert Repositories innerhalb SQLite Datenbanken in Form einer einzelnen Datei.
Der Workflow besteht grundsätzlich aus drei Schritten:
1. Ein Repository erstellen / Klonen
2. Den lokalen *Tree* betreten
3. Operationen auf das Repository ausführen
Wie auch Git, kann Fossil vollständig über die Kommandozeile gesteuert werden. Es bietet jedoch auch ein eingebautes Web Interface an, über welches viele Operationen ausgeführt werden können. Dieses schauen wir uns später noch an.
## Anleitung
### Projektinitialisierung
Ein neues Projekt kann mit dem folgenden Befehl erstellt werden.
```Fossil
fossil init <Reponame>
```
Alternativ kann auch ein Repository von einem Remote Server heruntergeladen werden:
```Fossil
fossil clone <URL> <Reponame>
```
Bei der Initialisierung wird einem ein Benutzer auf dem Repository erstellt. Der Benutzername und das Password werden als Antwort auf den Befehl ausgegeben. Das Passwort kann später noch geändert werden. Diese Daten werden vorausgesetzt, um das Web GUI nutzen zu können.
### Repository betreten ("Checkout")
Nachdem ein Repository initialisiert wurde, kann es betreten werden:
```Fossil
fossil open <Reponame> <?Version>
```
Mit jedem Beitritt wird ein "Tree" (vergleichbar einem Git Branch) angewendet. Wird keine Version angegeben, bleibt man auf dem main Branch, welcher "trunk" genannt wird. Über *Version* kann entsprechend ein anderer Tree ausgewählt werden.
Jetzt kann man mit den eigentlichen Operationen beginnen.
### Änderungen Speichern
Zum Projekt hinzugefügt werden können Dateien über die folgenden drei Befehle:
```Fossil
fossil add <Datei>
fossil rm <Datei>
fossil addremove
```
Die ersten zwei Befehle benehmen sich ziemlich intuitiv und entfernen beziehungsweise fügen die Dateien dem Projekt hinzu. Der *addremove* Befehl führt alle nötigen *add* und *rm* Befehle aus um das Repository mit dem Inhalt des Checkouts zu synchronisieren. Das heisst, dass alle Dateien die auf dem Checkout vorhanden, auf dem Repository aber abwesend sind, hinzugefügt und alle Dateien des Repositories, die auf dem Checkout fehlen, entfernt werden.
Die geänderten Dateien können auch eingesehen werden:
```Fossil
fossil changes
```
### Commits
Um den Zustand zu speichern muss ein Commit gemacht werden:
```Fossil
fossil commit
```
### Synchronisieren mit dem Remote
Commits werden vorerst nur lokal durchgeführt. Um diese auch auf einem Remote Server zu haben, müssen die Änderungen ge*pushed* werden.
Wenn autosync ausgeschaltet ist, können die Änderungen manuell dem Remote Host gesendet werden:
```Fossil
fossil push
```
Dieser Befehl aktualisiert jedoch nur den Remote Host mit den lokalen Änderungen nicht aber umgekehrt. Dafür muss das Remote Repo ge*pulled* werden:
```Fossil
fossil pull
```
Über folgenden Befehl kann auch beides zeitgleich bewirkt werden:
```Fossil
fossil sync
```
### Das eingebaute Web GUI
Eines der aussergewöhnlichsten Features von Fossil ist das eingebaute Web GUI. Zum Aufruf kann ganz einfach der Befehl *ui* genutzt werden:
```Fossil
fossil ui <Reponame>
```
Dadurch öffnet sich ein Webserver auf welchem die Applikation läuft.
![[fossil_ui_home.png]]
Darin können wir jetzt verschiedenste Aktionen sehen und ausführen. Ein Beispiel wäre die Timeline.
![[fossil-timeline.png]]
Darauf sieht man alle Commits die gemacht wurden und kann die Inhalte dieser auch direkt vergleichen. Bei mehreren Branches wäre der Graph natürlich komplizierter.
Es gibt auf dieser Seite aber auch features wie ein Forum, ein Ticket System, ein Chat oder ein Wiki. Diese werden über Markdown gespeichert und können so auch einfach synchronisiert werden.
Das UI ist sehr umfangreich und ich habe hier nur wenige Features erwähnt. Es gibt auch unzählige Möglichkeiten um das Repo zu konfigurieren und modifizieren. Es ist empfohlen einmal ein Repo zu erstellen um das Web GUI zu erkunden.
![[navigationsmöglichkeiten.png]]
## Fazit
Fossil ist ein Feature-reiches Version Control System welches eine neue Perspektive für die Thematik bietet. Es zeigt durchaus Ähnlichkeiten mit bekannteren Alternativen wie Git, bietet jedoch viele einzigartige Erweiterung.