Game of Trees Comparison to other version control systems

The user interface of the Got client is heavily influenced by Git, CVS, and SVN. Some inspiration was taken from Fossil and Mercurial.

CVS and SVN users will find a familiar user interface which offers additional commands for transferring changes between repositories across the network.

Git users should be aware that Got treats every Git repository as if it was bare. This means Got completely ignores the Git work tree and the Git index. A separate work tree must be checked out from a Git repository while working with Got.

A unique feature of Got is its multi-process model working behind the scenes, tailored to interfaces provided by the OpenBSD kernel. Processes with an inherent attack surface, such as those talking to the network or parsing the data in repositories, run in a separate address space and with as little capabilities as possible. The OpenBSD version of Got provides the strongest protections by using pledge and unveil in combination. For example, unveil enforces read-only access to repositories while the Got server is serving fetches. The Got client main process restricts itself to the repository directory (read-only or read-write as appropriate), the /tmp directory, and the work tree. Processes speaking the network protocol have no direct filesystem access at all. All processes are pledged as tightly as possible to restrict the available system calls to those required for regular operation. The -portable version of Got uses Capsicum on FreeBSD and Landlock on Linux to restrict filesystem access during network access and parsing of repository data, but does not restrict the main process (yet?).

The table below lists network protocols supported by Got and some other systems. For now, Got lacks support for Git's HTTP protocols, relying exclusively on OpenSSH. Got clients interoperate well with popular Git hosting sites over SSH, and Got servers can safely offer anonymous SSH access for public distribution.

SSH, git (client) SSH, pserver SSH, svn, HTTP SSH, git, HTTP

The following table lists applicable software licenses:

ISC GPLv1 or later Apache 2 GPLv2 only

The table below lists some commonly used commands and their rough equivalents in other systems:

got clone cvsync / reposync svnsync git clone --bare
gotadmin init cvs init svnadmin create git init --bare
got checkout cvs checkout svn checkout git clone / git worktree
got update cvs update svn update git checkout HEAD
got update -c <commit> cvs update -r svn update -r git checkout <commit>
got update -b <branch> cvs update -r svn switch git checkout <branch> / git switch
got branch cvs tag svn copy git checkout -b <branch>
got status cvs update -n svn status git status -s
got diff cvs diff -uNP svn diff git diff --patience
got patch /usr/bin/patch svn patch git apply
got add <unversioned path> cvs add svn add git add
got stage [-p] (optional) git add [-p] (required before git commit)
got unstage [-p] git checkout [-p] / git restore [-p]
got revert [-p] svn revert git reset --hard
got commit cvs commit svn commit git commit <path> / git commit -a
got tag cvs tag svn copy git tag
got fetch cvsync / reposync svnsync git fetch
got send git push
got log -p svn log --diff git log -p
got blame cvs blame svn praise git blame
got tree svn list git ls-tree
got rebase git rebase
got histedit git rebase -i
got merge (2 parents) cvs update -j -j svn merge git merge (up to N parents)
got cherrypick cvs update -j -j svn merge -c <rev> git cherry-pick
got backout cvs update -j -j svn merge -c -<rev> git revert
tog tig
gotadmin pack svnadmin pack git repack
gotadmin cleanup svnadmin cleanup git gc