Fossil , by D. Richard Hipp

Fossil is a software configuration management (SCM) system.


"Fossil" is also the name of the filesystem in Plan 9 4th Edition [L1 ]. Plan 9 Fossil runs on top of Venti [L2 ] which indexes files and file fragments by their SHA-1 hash.


Fossil is different - it works very much on the "show your work" principle, rather than pretending that commits, up to and including point releases, sprang fully-armed from the forehead of Zeus.
-- KBK ,on Git and Fossil, Tcl Chatroom ,2013-12-15


  • Bug Tracking And Wiki
  • Web Interface
  • Autosync
  • Self-Contained
  • Simple Networking
  • CGI Enabled
  • Robust & Reliable


Fossil license page%|%BSD(2) (Fossil was originally GPL licensed, but was changed in the first half of 2010.)

See Also

Developing Tcl with Batteries Included
how to access the Tcl fossil repositories
Getting Started With Working On The Tcl/Tk Core
Multiple Fossil Repositories as CGI at Apache2


Version Control with Fossil , Jake Edge, 2011


Fossil Quickstart
Fossil vs CVS Commands
for people coming from CVS
Import and Export
converting between Fossil and git
Branching, Forking, Merging, and Tagging


fossil gui.
a script written in Tcl/Expect with the following features:
  • Command aliasing and pre-processing
  • Output filtering
  • A number of preconfigured aliases, filters for colouring output
fx aka fossil2git
aka "Fossil eXtended" is a support tool providing additional repository management facilities not provided by core "fossil" itself. Among these are generation of ticket and other change notifications, mirroring with multiple copies of a project, export to git-mirrors, and more.
Converting CVS to Fossil , by Hypnotoad
Some notes and scripts to facilitate the process.
SVN to Fossil , by Hypnotoad
enables risky operations that version-control systems don't want to let you do, such as editing past comments and metadata and removing commits. It works with any version control system that can export and import git fast-import streams, including git, hg, fossil, bzr, CVS, RCS, and src. It can also read Subversion dump files directly and can thus be used to script production of very high-quality conversions from Subversion to any supported DVCS. The original motivation for reposurgeon was to clean up artifacts created by repository conversions.


Fossil is designed to control and track the development of a software project and to record the history of the project. There are many such systems in use today. Fossil strives to distinguish itself from the others by being extremely simple to setup and operate.

Fossil stores content using an enduring file format in an SQLite database so that transactions are atomic even if interrupted by a power loss or system crash. Furthermore, automatic self-checks verify that all aspects of the repository are consistent prior to each commit. In over three years of operation, no work has ever been lost after having been committed to a Fossil repository.

Setup of the bug-tracking subsystem is accomplished using a Tcl-like language called TH1 . Full bidirectional integration with full Tcl is also supported (must be enabled at compile-time and runtime).

Tips and Tricks

versionless link to a file


override mime type

To override the mime type of a file when viewing the raw content, add the m parameter to the query with a value of text/plain

standard merge

HaO 2013-05-28 (Info from Jan Nijtmans):

There is a branch 'branch1', branched from trunk after the checkin with id 'checkin1'.

I merge it back to trunk when I am in a checkout of trunk:

% mkdir trunk
% cd trunk
% fossil open -R ../repository.fossil
% fossil merge branch1

merge to another branch

HaO 2013-05-28 (Info from Jan Nijtmans):

Now I have another branch 'branch2' and I want to merge the changes within 'branch1' to this second branch.

So I go to a checkout of branch2 and try a merge:

% mkdir branch2
% cd branch2
% fossil open -R ../repository.fossil branch2
% fossil merge branch1

This does not work, as it will merge also all changes contained in 'checkin1', the origin of the branch 'branch1'.

% fossil undo

To limit the merged changes to the changes done in 'branch1', one must use the '--baseline' option:

% fossil merge --baseline checkin1 branch1


A practical example is to merge an msgcat bug fix in the branch 'bug3036566' into the trunk (e.g. tcl8.6) and into tcl8.5 (tag 'core-8-5-branch').

The bug branch was forked from trunk after checkin '76f6a1495e'.

% mkdir bug3036566
% cd bug3036566
% fossil open -R ../tcl.fossil
--- make modifications ---
% fossil commit -branch bug3036566 --branchcolor #ffc0c0

which looked after some modifications like that: [L3 ]

Now trunk was merged:

% mkdir trunk
% cd trunk
% fossil open -R ../tcl.fossil
% fossil merge bug3036566
--- test ---
% fossil commit

To merge the changes to tcl8.5 branch:

% mkdir core-8-5-branch
% cd core-8-5-branch
% fossil open -R ../tcl.fossil core-8-5-branch
% fossil merge --baseline 76f6a1495e bug3036566
--- test ---
% fossil commit

Merge two separate repositories

Use SQL to manually change the project_code of one repo to exactly match the project_code of the other. Then sync them. Caution: The change is irreversible.

Reference: Tcl Chatroom log, 2014-08-19

Building Fossil 2.4 on Debian with Tcl integration

apt install tcl8.6 tcl build-essential libssl-dev zlib1g-dev;
wget -qO- | tar xz;
cd fossil-2.5; ./configure --with-tcl=1 --with-tcl-private-stubs=1; make;

This will produce an executable fossil file in the present working directory.