commit - 41ae98c905c4378d82f873038625b205a82a4557
commit + 93069372c63185b1160a379ded434c79a9c83b1f
blob - /dev/null
blob + 3c36a4ad8475705d3e49ef80a1948eb4407a857b (mode 644)
--- /dev/null
+++ comparison.html
+<!doctype html>
+<html lang=en>
+<head>
+<meta charset=utf-8>
+
+<title>Game of Trees (Got): Goals</title>
+<meta name="description" content="Game of Trees (Got) Comparison to other version control systems">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<link rel="stylesheet" type="text/css" href="openbsd.css">
+<link rel="canonical" href="https://gameoftrees.org/comparison.html">
+</head>
+
+<body>
+<h2>
+<a href="index.html">
+<i>Game of Trees</i></a>
+Comparison to other version control systems
+</h2>
+<hr>
+The user interface of the Got <a href="got.1.html">client</a> is heavily influenced
+by Git, CVS, and SVN. Some inspiration was taken from Fossil and Mercurial.
+
+<p>CVS and SVN users will find a familiar user interface which offers additional
+commands for transferring changes between repositories across the network.
+
+<p>Git users should be aware that Got treats every
+<a href="git-repository.5.html">Git repository</a> as if it was <i>bare</i>.
+This means Got completely ignores the Git work tree and the Git index.
+A separate <a href="got-worktree.5.html">work tree</a> must be checked out from
+a Git repository while working with Got.
+
+<p>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
+<a href="https://man.openbsd.org/pledge">pledge</a> and
+<a href="https://man.openbsd.org/unveil">unveil</a>
+in combination.
+For example, unveil enforces read-only access to repositories while the
+Got <a href="gotd.8.html">server</a> is serving fetches.
+The Got client main process restricts itself to the repository directory (read-only
+or read-write as appropriate), the <tt>/tmp</tt> 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?).
+
+<p>
+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
+<a href="https://openssh.com">OpenSSH</a>.
+Got clients interoperate well with popular Git hosting sites over SSH,
+and Got servers can safely offer anonymous SSH access for public distribution.
+
+<table border=0 width=100%>
+<td><b>Got <td><b>CVS <td><b>SVN <td><b>Git </b>
+<tr>
+<td><tt>SSH, git (client)<td><tt>SSH, pserver <td><tt>SSH, svn, HTTP <td><tt>SSH, git, HTTP
+</table>
+
+<p>
+The following table lists applicable software licenses:
+
+<table border=0 width=100%>
+<td><b>Got <td><b>CVS <td><b>SVN <td><b>Git </b>
+<tr>
+<td><a href="releases/LICENCE">ISC</a> <td>GPLv1 or later <td>Apache 2 <td>GPLv2 only
+</table>
+
+<p>
+The table below lists some commonly used commands and their rough equivalents in other systems:
+<table border=0 width=100%>
+<td><b>Got <td><b>CVS <td><b>SVN <td><b>Git </b>
+<tr>
+<td><tt><a href="got.1.html#clone">got clone</a> <td><tt>cvsync / reposync <td><tt>svnsync <td><tt>git clone --bare
+<tr>
+<td><tt><a href="gotadmin.1.html#init">gotadmin init</a><td><tt>cvs init <td><tt>svnadmin create <td><tt>git init
+<tr>
+<td><tt><a href="got.1.html#checkout">got checkout</a> <td><tt>cvs checkout <td><tt>svn checkout <td><tt>git clone / git worktree
+<tr>
+<td><tt><a href="got.1.html#update">got update</a> <td><tt>cvs update <td><tt>svn update <td><tt>git checkout HEAD
+<tr>
+<td><tt>got update -c <commit> <td><tt>cvs update -r <td><tt>svn update -r <td><tt>git checkout <commit>
+<tr>
+<td><tt>got update -b <branch> <td><tt>cvs update -r <td><tt>svn switch <td><tt>git checkout <branch> / git switch
+<tr>
+<td><tt><a href="got.1.html#branch">got branch</a> <td><tt>cvs tag <td><tt>svn copy <td><tt>git checkout -b <branch>
+<tr>
+<td><tt><a href="got.1.html#status">got status</a> <td><tt>cvs update -n <td><tt>svn status <td><tt>git status -s
+<tr>
+<td><tt><a href="got.1.html#diff">got diff</a> <td><tt>cvs diff -uNP <td><tt>svn diff <td><tt>git diff --patience
+<tr>
+<td><tt><a href="got.1.html#patch">got patch</a> <td><tt>/usr/bin/patch <td><tt>svn patch <td><tt>git am
+<tr>
+<td><tt><a href="got.1.html#add">got add</a> <unversioned path> <td><tt>cvs add <td><tt>svn add <td><tt>git add
+<tr>
+<td><tt><a href="got.1.html#stage">got stage</a> [-p] <i>(optional)</i><td><tt>-- <td><tt>-- <td><tt>git add [-p] <i>(required before git commit)</i>
+<tr>
+<td><tt><a href="got.1.html#unstage">got unstage</a> [-p]<td><tt>-- <td><tt>-- <td><tt>git checkout [-p] / git restore [-p]
+<tr>
+<td><tt><a href="got.1.html#revert">got revert</a> [-p] <td><tt>-- <td><tt>svn revert <td><tt>git checkout [-p] / git restore [-p]
+<tr>
+<td><tt><a href="got.1.html#commit">got commit</a> <td><tt>cvs commit <td><tt>svn commit <td><tt>git commit PATH / git commit -a
+<tr>
+<td><tt><a href="got.1.html#tag">got tag</a> <td><tt>cvs tag <td><tt>svn copy <td><tt>git tag
+<tr>
+<td><tt><a href="got.1.html#fetch">got fetch</a> <td><tt>cvsync / reposync <td><tt>svnsync <td><tt>git fetch
+<tr>
+<td><tt><a href="got.1.html#send">got send</a> <td><tt>-- <td><tt>-- <td><tt>git push
+<tr>
+<td><tt><a href="got.1.html#log">got log</a> -p <td><tt>-- <td><tt>svn log --diff <td><tt>git log -p
+<tr>
+<td><tt><a href="got.1.html#blame">got blame</a> <td><tt>cvs blame <td><tt>svn praise <td><tt>git blame
+<tr>
+<td><tt><a href="got.1.html#tree">got tree</a> <td><tt>-- <td><tt>svn list <td><tt>git ls-tree
+<tr>
+<td><tt><a href="got.1.html#rebase">got rebase</a> <td><tt>-- <td><tt>-- <td><tt>git rebase
+<tr>
+<td><tt><a href="got.1.html#histedit">got histedit</a> <td><tt>-- <td><tt>-- <td><tt>git rebase -i
+<tr>
+<td><tt><a href="got.1.html#merge">got merge</a> <i>(2 parents)</i><td><tt>cvs update -j -j <td><tt>svn merge <td><tt>git merge <i>(up to N parents)</i>
+<tr>
+<td><tt><a href="got.1.html#cherrypick">got cherrypick</a> <td><tt>cvs update -j -j <td><tt>svn merge -c <rev> <td><tt>git cherrypick
+<tr>
+<td><tt><a href="got.1.html#backout">got backout</a> <td><tt>cvs update -j -j <td><tt>svn merge -c -<rev> <td><tt>git revert
+<tr>
+<td><tt><a href="tog.1.html">tog</a> <td><tt>-- <td><tt>-- <td><tt>tig
+<tr>
+<td><tt><a href="gotadmin.1.html#pack">gotadmin pack</a> <td><tt>-- <td><tt>svnadmin pack <td><tt>git repack
+<tr>
+<td><tt><a href="gotadmin.1.html#cleanup">gotadmin cleanup</a> <td><tt>-- <td><tt>svnadmin cleanup <td><tt>git gc
+<tr>
+</table>
+</body>
+</html>