The Full Wiki

Monotone (software): Wikis


Note: Many of our articles have direct quotes from sources you can cite, within the Wikipedia article! This article doesn't yet, but we're working on it! See more info or our list of citable articles.


From Wikipedia, the free encyclopedia

Developer(s) Nathaniel Smith, Graydon Hoare
Initial release ?
Stable release 0.45  (Sep 11, 2009) [+/−]
Preview release n/a  (?) [+/−]
Written in C++
Operating system Unix, Linux, BSD, Mac OS X, Windows
Available in ?
Type revision control
License GPL
Website Monotone home

Monotone is an open source software tool for distributed revision control. Monotone tracks revisions to files, groups sets of revisions into changesets, and tracks history across renames. The design principle is distributed operation making heavy use of cryptographic primitives to track file revisions (via the SHA-1 secure hash) and to authenticate user actions (via RSA cryptographic signatures). Each participant maintains their own revision history store in a local SQLite database. Monotone is especially strong in its support of a diverge/merge workflow, which it achieves in part by always allowing commit before merge.[1] Revisions are exchanged using the custom netsync protocol which shares some conceptual ground with rsync and cvsup. The focus of the project is on integrity over performance. Prior to some heavy optimisation in revision 0.27, this emphasis on correctness over optimisation was often blamed for causing poor initial experiences. The first action of a new user is often to synchronize (clone) a large existing Monotone database, an action which used to take hours to execute due to the extensive validation and integrity checking which Monotone performs when revisions are moved through the network. Once the initial (clone) database is populated, subsequent actions are usually quick. There is still room for further optimisation on some rarer functions.



Like GNU arch, and unlike Subversion, Monotone takes a distributed approach to version control. Monotone uses SHA-1 hashes to identify specific files or groups of files, as with Git and Mercurial, in the place of version numbers.

Although Monotone originally supported a variety of networking protocols for synchronizing trees, it now exclusively uses a custom protocol called netsync, which is more robust and efficient (however, as of version 0.27, it is possible to use the netsync protocol over any stream, notably including ssh connections). Netsync has its own IANA-assigned port (4691) and is supported by a Wireshark plug-in for traffic analysis. There is no separate Monotone server because any Monotone client can act as a server.

Other features of Monotone include:

As of January 2008, possible drawbacks of Monotone include:

  • Potential users cannot checkout (or commit) from behind a proxy (very common in corporate environments) due to non-http protocol.
  • Less popular than some competing systems such as Bazaar, Git or Mercurial
  • Speed issues for certain operations (most noticeable initial pull)
  • A general lack of stable GUI interfaces; some are in the work though, e.g. TracMtn, a Trac plugin for history and repository browsing, or guitone, a Qt-frontend to manage workspaces and databases.


Monotone version 0.26 introduced major changes to the internal database structures, including a new structure known by Monotone developers as a roster[2]. Monotone databases created with version 0.26 can not exchange revisions with older Monotone databases. The older databases must first be upgraded to the new format. The new netsync protocol is incompatible with earlier versions of Monotone.


Monotone is implemented in modern-dialect C++ on top of the Boost system library, the Botan cryptography library, and the SQLite database library. Monotone supports customization and extension via hook functions written in the Lua programming language. The monotone build process is automated with BuildBot and includes extensive regression tests.

Monotone as Git inspiration

In April 2005, Monotone became the subject of increased interest in the FLOSS community after Linus Torvalds mentioned it as a possible replacement for BitKeeper in the Linux development process.[3] Instead of adopting Monotone, Torvalds wrote his own SCM system, Git. Git's design uses some ideas from Monotone, but the two projects do not share any core source code.

A key issue debated was whether the replacement of BitKeeper should support cherry picking wherein the tree maintainer can approve a subset of patches while rejecting others on an individual basis. Linus argues that this approach "results in the wrong dynamics and psychology in the system" by shifting burden to the upstream maintainers rather than forcing downstream maintainers to put more effort into keeping their trees free from garbage. He further argues that Monotone is correct in its aversion to cherry-picking as a feature, but then fails to take it far enough by not making it easy enough to "throw away" unclean working trees after their purpose is served.[4] He also noted his perception that Monotone at that time had not achieved the performance level required by a project as large as Linux kernel development.

This argument runs contrary to the perception among many software developers that cherry picking is an advanced feature that an SCM tool should strive to support. Other SCM tools, such as Darcs, are particularly strong in this area. Nowadays, both Git and Monotone have supported cherry picking for some time.


Currently support for the software is available via mailing lists, IRC, and a support wiki.

Monotone users

See also


  1. ^ "Dealing with a Fork - monotone documentation". Retrieved 2008-06-30.  
  2. ^ What are rosters
  3. ^ Linux-Kernel Archive: Kernel SCM saga
  4. ^ LKML: Linus Torvalds: Re: Kernel SCM saga
  5. ^ "Limitations of Monotone". Retrieved 2009-04-29.  

External links



Got something to say? Make a comment.
Your name
Your email address