Fossil: Das ultimative All-in-One-(Binary) – SCM

Ich mag mein Subversion ja schon sehr – Aber diejenigen unter euch, die mich etwas länger kennen, wissen auch, dass ich sehr gern kleine Dinge mag – insbesondere kleine Software 🙂
Fossil ist ein All-in-One SCM in einer einzigen Datei mit Quellcode-Verwaltung, Ticket-System und Wiki.
Das tolle daran: es ist kostenlos und auch für Windows erhältlich! 🙂
Genacht ist das ganze von den SQLite Entwicklern, weshalb Fossil als Backend SQLite benutzt und eine Fossil-Datenbank somit auch eine SQLite-Datei ist.

Hier nur ein paar Grundlagen um die meist gebrauchten Funktionen von Fossil zu demonstrieren…

Download: http://www.fossil-scm.org/download.html

Um meine Beispiele nachvollziehen zu können, stelle ich noch eine Zip-Datei zusammen, welche es hier zum Download geben wird.
Link: http://frickelblog.googlecode.com/files/2011-02-24_fossiltest.zip

Ich teste alles in dem Verzeichnis „c:\fossiltest\“. Dort liegt auch meine fossil.exe.
Mein Arbeitsverzeichnis mit dem Quellcode liegt in „c:\fossiltest\WorkDir\“.

Als erstes gehen wir mit der cmd in das Arbeitsverzeichnis:

cd c:\fossiltest

Oder die cmd.exe verknüpfung aufrufen, welche ich mit in die zip gepackt habe.

Nun können wir ein neues Fossil-Repository anlegen.

C:\fossiltest> fossil.exe new repo.fossil

Die Ausgabe ist erst mal unwichtig, da wir das Repo nur Lokal benutzen und dafür kein Passwort brauchen.

Jetzt wechseln wir in das Arbeitsverzeichnis und öffnen das Repo (checkout)

C:\fossiltest> cd WorkDir
C:\fossiltest\WorkDir>..\fossil.exe open ..\repo.fossil

Es kommt keine Ausgabe, dafür wird eine „_FOSSIL_“ Datei im Arbeitsverzeichnis erstellt.
Die Datei enthält z.b. Zeitinformationen der Dateien im Arbeitsverzeichnis, um sie bei einem Vergleich vergleichen zu können.

An dieser Stelle wollen wir vermutlich Dateien zu dem Repository hinzufügen. Dies geht so:

C:\fossiltest\WorkDir>..\fossil.exe add *
C:\fossiltest\fossil.exe: cannot add _FOSSIL_
ADDED  Fossiltestsln/Form1.Designer.cs
ADDED  Fossiltestsln/Form1.cs
ADDED  Fossiltestsln/Fossiltestsln.csproj
ADDED  Fossiltestsln/Program.cs
ADDED  Fossiltestsln/Properties/AssemblyInfo.cs
ADDED  Fossiltestsln/Properties/Resources.Designer.cs
ADDED  Fossiltestsln/Properties/Resources.resx
ADDED  Fossiltestsln/Properties/Settings.Designer.cs
ADDED  Fossiltestsln/Properties/Settings.settings
ADDED  Fossiltestsln/bin/Debug/Fossiltestsln.exe
ADDED  Fossiltestsln/bin/Debug/Fossiltestsln.pdb
ADDED  Fossiltestsln/bin/Debug/Fossiltestsln.vshost.exe
ADDED  Fossiltestsln/bin/Debug/Fossiltestsln.vshost.exe.manifest
ADDED  Fossiltestsln/obj/Debug/Fossiltestsln.Properties.Resources.resources
ADDED  Fossiltestsln/obj/Debug/Fossiltestsln.csproj.FileListAbsolute.txt
ADDED  Fossiltestsln/obj/Debug/Fossiltestsln.csproj.GenerateResource.Cache
ADDED  Fossiltestsln/obj/Debug/Fossiltestsln.exe
ADDED  Fossiltestsln/obj/Debug/Fossiltestsln.pdb
ADDED  Fossiltestsln.sln
ADDED  Fossiltestsln.suo

Hm… Schon mal nicht schlecht… Aber ein Paar Dateien bzw DateiTypen wollen wir garnicht im Repo haben.
Dazu gehören z.b. in C# Projekten diese: *.dll,*.exe,*.pdb,*.suo
Glücklicherweise kann man diese von Fossil beim Adden Ignorieren lassen.
Dafür muss man dies tun:

C:\fossiltest\WorkDir>..\fossil.exe settings ignore-glob *.dll,*.exe,*.pdb,*.suo

Jetzt noch mal alles aus dem Repo raus nehmen:

C:\fossiltest\WorkDir>..\fossil.exe delete *
C:\fossiltest\fossil.exe: not in the repository: _FOSSIL_

Das er die Datei _FOSSIL_ nicht im Repo hatte, ist nicht schlimm, wollen wir eigentlich auch gar nicht drin haben 🙂

Und nun wieder alles hinzufügen:

C:\fossiltest\WorkDir>..\fossil.exe add *
C:\fossiltest\fossil.exe: cannot add _FOSSIL_
ADDED  Fossiltestsln/Form1.Designer.cs
ADDED  Fossiltestsln/Form1.cs
ADDED  Fossiltestsln/Fossiltestsln.csproj
ADDED  Fossiltestsln/Program.cs
ADDED  Fossiltestsln/Properties/AssemblyInfo.cs
ADDED  Fossiltestsln/Properties/Resources.Designer.cs
ADDED  Fossiltestsln/Properties/Resources.resx
ADDED  Fossiltestsln/Properties/Settings.Designer.cs
ADDED  Fossiltestsln/Properties/Settings.settings
ADDED  Fossiltestsln/bin/Debug/Fossiltestsln.vshost.exe.manifest
ADDED  Fossiltestsln/obj/Debug/Fossiltestsln.Properties.Resources.resources
ADDED  Fossiltestsln/obj/Debug/Fossiltestsln.csproj.FileListAbsolute.txt
ADDED  Fossiltestsln/obj/Debug/Fossiltestsln.csproj.GenerateResource.Cache
ADDED  Fossiltestsln.sln
ADDED  Fossiltestsln.suo

Jetzt fügt er die oben angegebenen Dateitypen nicht mehr mit hin zu.
Sooo… Jetzt haben wir zwar die Dateien hinzu gefügt, aber Physisch befidnen sich die Dateien noch nicht im Repository.
Dies geschieht erst mit einen Commit, der geht so:

C:\fossiltest\WorkDir>..\fossil.exe commit -m "erste version"
New_Version: 0b34f1e3bccb4e3d50cae493ff80280007c659bd

Somit ist die Erste Version von unserem Code versioniert.
Die Dateien im Repo können wir uns auch anschauen:

C:\fossiltest\WorkDir>..\fossil.exe ls
Fossiltestsln.sln
Fossiltestsln.suo
Fossiltestsln/Form1.Designer.cs
Fossiltestsln/Form1.cs
Fossiltestsln/Fossiltestsln.csproj
Fossiltestsln/Program.cs
Fossiltestsln/Properties/AssemblyInfo.cs
Fossiltestsln/Properties/Resources.Designer.cs
Fossiltestsln/Properties/Resources.resx
Fossiltestsln/Properties/Settings.Designer.cs
Fossiltestsln/Properties/Settings.settings
Fossiltestsln/bin/Debug/Fossiltestsln.exe
Fossiltestsln/bin/Debug/Fossiltestsln.pdb
Fossiltestsln/bin/Debug/Fossiltestsln.vshost.exe
Fossiltestsln/bin/Debug/Fossiltestsln.vshost.exe.manifest
Fossiltestsln/obj/Debug/Fossiltestsln.Properties.Resources.resources
Fossiltestsln/obj/Debug/Fossiltestsln.csproj.FileListAbsolute.txt
Fossiltestsln/obj/Debug/Fossiltestsln.csproj.GenerateResource.Cache
Fossiltestsln/obj/Debug/Fossiltestsln.exe
Fossiltestsln/obj/Debug/Fossiltestsln.pdb

So….
Was wollen wir mal machen…?
Fügen wir einfach mal einen Knopf auf der Form hinzu und schauen uns was sich geändert hat:

C:\fossiltest\WorkDir>..\fossil.exe changes
EDITED     Fossiltestsln.suo
EDITED     Fossiltestsln/Form1.Designer.cs
EDITED     Fossiltestsln/Fossiltestsln.csproj
EDITED     Fossiltestsln/obj/Debug/Fossiltestsln.csproj.FileListAbsolute.txt
EDITED     Fossiltestsln/obj/Debug/Fossiltestsln.csproj.GenerateResource.Cache

Und das geht auch wieder durch einen Commit in das Repo:

C:\fossiltest\WorkDir>..\fossil.exe commit -m "zweite version"
New_Version: b745951be3586c55e5ef2a0008f7a8e201874bfb

Und weil es so schön ist, gibts noch einen Knopf mehr.

C:\fossiltest\WorkDir>..\fossil.exe changes
EDITED     Fossiltestsln/Form1.Designer.cs
EDITED     Fossiltestsln/Form1.cs
EDITED     Fossiltestsln/obj/Debug/Fossiltestsln.csproj.GenerateResource.Cache

Dieses mal machen wir KEINEN commit.
Hier möchte ich mir anzeigen lassen, was sich in der Form1.cs im gegensatz zu der version im Repo geändert hat.

C:\fossiltest\WorkDir>..\fossil.exe diff Fossiltestsln\Form1.cs
--- Fossiltestsln\Form1.cs
+++ Fossiltestsln\Form1.cs
@@ -12,8 +12,13 @@
        public partial class Form1 : Form
        {
                public Form1()
                {
                        InitializeComponent();
+               }
+
+               private void button2_Click(object sender, EventArgs e)
+               {
+                       this.Close();
                }
        }
 }

Nicht ganz so übersichtlich, aber man erkennt die Änderungen 🙂

Na gut… In der Hoffnung das das schon richtig sein wird, checken wir das wieder ein.

C:\fossiltest\WorkDir>..\fossil.exe commit -m "dritte version"
New_Version: 2f8a8f844656ba048c6a691793e16804edc2741a

Jetzt wollen wir uns natürlich auch mal eine Historie der Änderungen anschauen, die wir bis jetzt gemacht haben.
Dies geht über die „Timeline“:

C:\fossiltest\WorkDir>..\fossil.exe timeline
=== 2011-02-24 ===
19:58:30 [2f8a8f8446] *CURRENT* dritte version (user: Sven Schmalle tags: trunk)
=== 2011-02-23 ===
21:53:47 [b745951be3] zweite version (user: Sven Schmalle tags: trunk)
21:51:50 [a62658178c] erste version (user: Sven Schmalle tags: trunk)
21:50:05 [3e30e76e54] initial empty check-in (user: Sven Schmalle tags: trunk)

Da hat man eine schöne Aufschlüsselung nach Tag und Uhrzeit.
So… das kann man auch noch beliebig eingrenzen.
Z.B. habe ich heute einen Checkin gemacht und gestern waren es 3 (mit dem Init bei neuerstellung des Repo).
Also wäre z.b. denkbar das ich mir alles anzeigen lassen möchte, was vor heute, dem 24.02.2011 geschehen ist.
Dies würde dann wie folgt gehen:

C:\fossiltest\WorkDir>..\fossil.exe timeline before "2011-02-24"
=== 2011-02-23 ===
21:53:47 [b745951be3] zweite version (user: Sven Schmalle tags: trunk)
21:51:50 [a62658178c] erste version (user: Sven Schmalle tags: trunk)
21:50:05 [3e30e76e54] initial empty check-in (user: Sven Schmalle tags: trunk)

Nun werden die 3 Checkins von gestern aufgelistet.

Was gibts noch zu sagen?
Diese Lustigen nummern, z.b. „2f8a8f8446“ sind die Revisions-Nummern.
Mit diesen kann man wiederum Vergleiche mit dem Diff-Tool machen.
Z.B. wenn man noch einmal wissen möchte, welche änderungen ind er Form1.cs geamcht wurden zwischen der zweiten und 3. version.

C:\fossiltest\WorkDir>..\fossil.exe diff --from b745951be3 --to 2f8a8f8446 Fossiltestsln\Form1.cs
--- Fossiltestsln/Form1.cs
+++ Fossiltestsln/Form1.cs
@@ -12,8 +12,13 @@
        public partial class Form1 : Form
        {
                public Form1()
                {
                        InitializeComponent();
+               }
+
+               private void button2_Click(object sender, EventArgs e)
+               {
+                       this.Close();
                }
        }
 }

Das ist in etwa das selbe was wir weiter oben auch schon gesehen haben, als wir die Änderungen der Form1.cs angeschaut haben BEVOR wir sie eingecheckt haben 🙂

Eine Komplette Datei einer Revision kann man sich natürlich auch anzeigen lassen.
Hier z.b. die Form1.cs aus der zweiten Revision:

C:\fossiltest\WorkDir>..\fossil.exe finfo -p Fossiltestsln\Form1.cs -r b745951be3
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Fossiltestsln
{
        public partial class Form1 : Form
        {
                public Form1()
                {
                        InitializeComponent();
                }
        }
}

Das kann man sich natürlich auch wiederum in eine Datei umleiten:

C:\fossiltest\WorkDir>..\fossil.exe finfo -p Fossiltestsln\Form1.cs -r b745951be3 > ..\Form1.cs

…und in C:\fossiltest liegt jetzt die „Form1.cs“ der zweiten Revision.

Ah.. eine Super-Praktische Funktion ist auch, dass man eine Revission als zip Datei ausgeben kann.
möchte man z.b. die zweite Revision (b745951be3) als Zip-Datei ausgeben, so geht das wie folgt:

C:\fossiltest\WorkDir>..\fossil.exe zip b745951be3 ../b745951be3.zip

…und in C:\fossiltest liegt jetzt eine „b745951be3.zip“ mit dem Inhalt der zweiten Revision.

Sooooo… das soll es zur Quellcode-verwaltung mit Fossil erstmal gewesen sein.
Na gut, ein bissl zeit haben wir noch, also schauen wir uns noch sch.nell die Tickets an.

Einführend habe ich oben erwähnt das es sich bei Fossil um ein mini-SCM handelt mit dem man unter anderem auch Tickets verwalten kann.
Dies möchte ich hier nur mal rudimentär demonstrieren.

Ein ticket kann man recht einfach anlegen.
Man braucht dafür minimal nur einen Betreff und einen Text für den Inhalt des Tickets.
Dies könnte z.b. So aussehen:

C:\fossiltest\WorkDir>..\fossil.exe ticket add title "1. Ticket" comment "Inhalt des ersten Ticket"
ticket add succeeded for UID 2377c44d9e8ce291dcdd0e1fdb1a1c0f51cf609d

Das Praktische hier dran ist das die Tickets HTML können.
Also.. ein Zeilenumbruch oder FETT Formatierungen gehen mit HTML.
Warum das so ist, dazu komme ich später.

C:\fossiltest\WorkDir>..\fossil.exe ticket add title "2. Ticket" comment "Ein Zeilen
umbruch und was FETTES" ticket add succeeded for UID 56a76d77f7009362856583c9d7c64ae5872b3496

So.. Diese Tickets können wir uns auch wieder als Liste anzeigen lassen…

C:\fossiltest\WorkDir>..\fossil.exe ticket show 1
bgcolor #       mtime   type    status  subsystem       title
#c8c8c8 2377c44d9e      2011-02-24 21:16:42                             1. Ticket
#c8c8c8 56a76d77f7      2011-02-24 21:35:28                             2. Ticket

Man kann darin allerdings auch Suchen:

C:\fossiltest\WorkDir>..\fossil.exe ticket show 1 [#]='2377c44d9e'
bgcolor #       mtime   type    status  subsystem       title
#c8c8c8 2377c44d9e      2011-02-24 21:16:42                             1. Ticket

Wobei [#] hier die Spalte ist in der gesucht wird – daraus wird dann eine WHERE SQL Klausel generiert.

So… nachdem ich nun das meiste erklärt habe, gebe ich euch noch einen Befehl:

C:\fossiltest\WorkDir>..\fossil.exe ui
Listening for HTTP requests on TCP port 8080
Launch webbrowser: start http://127.0.0.1:8080/
Type Ctrl-C to stop the HTTP server

Ja – wonach es aussieht ist es auch 🙂
Fossil hat einen Eingebauten Mini-Webserver über den man alle Checkins, und Tickets und Revisionen und alles recht einfach anschauen und auch neu anlegen und ändern kann 🙂

Schaut´s euch selbst an – ist alles recht Intuitiv bedienbar 🙂

Und jetzt wünsche ich viel Spaß mit der Verwendung von Fossil.
Über Berichte eurerseits als Kommentar hier würde ich mich auch sehr freuen 🙂

Nachtrag:
Unter pc-in-not.net gibt es auch einen schönen Blog-Eintrag zu Fossil.

Zweiter Nachtrag:

Um Neuen User anzulegen:

C:\fossil\neu>fossil.exe user new
login: sven
contact-info: sven@spicken.de
password: ****
Retype new password: ****

Um das Passwort eines Bestehenden Users zu ändern:

C:\fossil\neu>fossil.exe user password "sven schmalle" -R repo.fossil
New password for sven schmalle: *****
Retype new password: *****

One Response to Fossil: Das ultimative All-in-One-(Binary) – SCM

  1.  

    Schöner Artikel zur Einführung ins Fossil SCM.

leave your comment


*

Unterstütze den Frickelblog!