Version control, written in Haskell with all that monadic goodness (currently totally in progress and not finished at all)
Switch branches/tags
Nothing to show
Clone or download
Latest commit d6069a0 May 31, 2015


Version control, written in Haskell with all that monadic goodness! (Currently totally in progress and not finished in the least)

Build Status Coverage Status

Differences with Git

  • does not distinguish between tracked and untracked files
  • horse stage replaces git add and git rm
  • the staging area does not store changes; rather, it merely tracks filenames to commit
  • horse squash replaces git rebase -i
  • addition of horse unstage
  • horse init doesn't overwrite existing repositories like git init does
  • can't initialize a repo in a subdirectory of another repo
  • checkout completely overwrites working directory (product of not distinguishing between tracked and untracked files)
  • untrack and retrack replace .gitignore. Their behavior is also slightly different w.r.t. previously tracked files in Git, since horse-control doesn't distinguish between untracked and unstaged files.

Currently exposed commands and functionality


  • init
  • config
  • status
  • stage
  • unstage
  • commit
  • commit --amend
  • checkout
  • show
  • log
  • squash
  • untrack
  • untrack --list
  • retrack
  • diff
  • branch create
  • branch delete
  • branch list
  • cherry-pick


  • Git-like parent/ancestor syntax (^, ~)



> cabal install horse-control

non-cabal dependencies (database)


> sudo apt-get update -qq
> sudo apt-get install libsnappy-dev
> wget
> tar -xzf leveldb-1.9.0.tar.gz
> cd leveldb-1.9.0
> make
> sudo mv libleveldb.* /usr/local/lib
> cd include
> sudo cp -R leveldb /usr/local/include
> sudo ldconfig
> cd ../..


> brew install leveldb