Blob


1 <!doctype html>
2 <html lang=en>
3 <meta charset=utf-8>
5 <title>Game of Trees (Got): Comparison to other version control systems</title>
6 <meta name="description" content="Game of Trees (Got) Comparison to other version control systems">
7 <meta name="viewport" content="width=device-width, initial-scale=1">
8 <link rel="stylesheet" type="text/css" href="openbsd.css">
9 <link rel="canonical" href="https://gameoftrees.org/comparison.html">
11 <h2>
12 <a href="index.html">
13 <i>Game of Trees</i></a>
14 Comparison to other version control systems
15 </h2>
16 <hr>
17 The user interface of the Got <a href="got.1.html">client</a> is heavily influenced
18 by Git, CVS, and SVN. Some inspiration was taken from Fossil and Mercurial.
20 <p>CVS and SVN users will find a familiar user interface which offers additional
21 commands for transferring changes between repositories across the network.
23 <p>Git users should be aware that Got treats every
24 <a href="git-repository.5.html">Git repository</a> as if it was <i>bare</i>.
25 This means Got completely ignores the Git work tree and the Git index.
26 A separate <a href="got-worktree.5.html">work tree</a> must be checked out from
27 a Git repository while working with Got.
29 <p>A unique feature of Got is its multi-process model working behind the scenes,
30 tailored to interfaces provided by the OpenBSD kernel.
31 Processes with an inherent attack surface, such as those talking to the network or
32 parsing the data in repositories, run in a separate address space and with
33 as little capabilities as possible.
34 The OpenBSD version of Got provides the strongest protections by using
35 <a href="https://man.openbsd.org/pledge">pledge</a> and
36 <a href="https://man.openbsd.org/unveil">unveil</a>
37 in combination.
38 For example, unveil enforces read-only access to repositories while the
39 Got <a href="gotd.8.html">server</a> is serving fetches.
40 The Got client main process restricts itself to the repository directory (read-only
41 or read-write as appropriate), the <code>/tmp</code> directory, and the work tree.
42 Processes speaking the network protocol have no direct filesystem access at all.
43 All processes are pledged as tightly as possible to restrict the available system
44 calls to those required for regular operation.
45 The -portable version of Got uses Capsicum on FreeBSD and Landlock on Linux to restrict
46 filesystem access during network access and parsing of repository data, but does not
47 restrict the main process (yet?).
49 <p>
50 The table below lists network protocols supported by Got and some other systems.
51 For now, Got lacks support for Git's HTTP protocols, relying exclusively on
52 <a href="https://openssh.com">OpenSSH</a>.
53 Got clients interoperate well with popular Git hosting sites over SSH,
54 and Got servers can safely offer anonymous SSH access for public distribution.
56 <table>
57 <thead>
58 <tr>
59 <td><b>Got</b>
60 <td><b>CVS</b>
61 <td><b>SVN</b>
62 <td><b>Git</b>
63 </thead>
64 <tr>
65 <td><code>SSH, git (client)</code>
66 <td><code>SSH, pserver</code>
67 <td><code>SSH, svn, HTTP</code>
68 <td><code>SSH, git, HTTP</code>
69 </table>
71 <p>
72 The following table lists applicable software licenses:
74 <table>
75 <thead>
76 <tr>
77 <td><b>Got</b>
78 <td><b>CVS</b>
79 <td><b>SVN</b>
80 <td><b>Git</b>
81 </thead>
82 <tr>
83 <td><a href="releases/LICENCE">ISC</a>
84 <td>GPLv1 or later
85 <td>Apache 2
86 <td>GPLv2 only
87 </table>
89 <p>
90 The table below lists some commonly used commands and their rough equivalents in other systems:
91 <table>
92 <thead>
93 <tr>
94 <td><b>Got</b>
95 <td><b>CVS</b>
96 <td><b>SVN</b>
97 <td><b>Git</b>
98 </thead>
99 <tr>
100 <td><code><a href="got.1.html#clone">got clone</a></code>
101 <td><code>cvsync</code> / <code>reposync</code>
102 <td><code>svnsync</code>
103 <td><code>git clone --bare</code>
104 <tr>
105 <td><code><a href="gotadmin.1.html#init">gotadmin init</a></code>
106 <td><code>cvs init</code>
107 <td><code>svnadmin create</code>
108 <td><code>git init --bare</code>
109 <tr>
110 <td><code><a href="got.1.html#checkout">got checkout</a></code>
111 <td><code>cvs checkout</code>
112 <td><code>svn checkout</code>
113 <td><code>git clone</code> / <code>git worktree</code>
114 <tr>
115 <td><code><a href="got.1.html#update">got update</a></code>
116 <td><code>cvs update</code>
117 <td><code>svn update</code>
118 <td><code>git checkout HEAD</code>
119 <tr>
120 <td><code>got update -c <var>&lt;commit&gt;</var></code>
121 <td><code>cvs update -r</code>
122 <td><code>svn update -r</code>
123 <td><code>git checkout <var>&lt;commit&gt;</var></code>
124 <tr>
125 <td><code>got update -b <var>&lt;branch&gt;</var></code>
126 <td><code>cvs update -r</code>
127 <td><code>svn switch</code>
128 <td><code>git checkout <var>&lt;branch&gt;</var></code> / <code>git switch</code>
129 <tr>
130 <td><code><a href="got.1.html#branch">got branch</a></code>
131 <td><code>cvs tag</code>
132 <td><code>svn copy</code>
133 <td><code>git checkout -b <var>&lt;branch&gt;</var></code>
134 <tr>
135 <td><code><a href="got.1.html#status">got status</a></code>
136 <td><code>cvs update -n</code>
137 <td><code>svn status</code>
138 <td><code>git status -s</code>
139 <tr>
140 <td><code><a href="got.1.html#diff">got diff</a></code>
141 <td><code>cvs diff -uNP</code>
142 <td><code>svn diff</code>
143 <td><code>git diff --patience</code>
144 <tr>
145 <td><code><a href="got.1.html#patch">got patch</a></code>
146 <td><code>/usr/bin/patch</code>
147 <td><code>svn patch</code>
148 <td><code>git apply</code>
149 <tr>
150 <td><code><a href="got.1.html#add">got add</a> <var>&lt;unversioned path&gt;</var></code>
151 <td><code>cvs add</code>
152 <td><code>svn add</code>
153 <td><code>git add</code>
154 <tr>
155 <td><code><a href="got.1.html#stage">got stage</a> [-p]</code> <i>(optional)</i>
156 <td>&mdash;
157 <td>&mdash;
158 <td><code>git add [-p]</code> <i>(required before git commit)</i>
159 <tr>
160 <td><code><a href="got.1.html#unstage">got unstage</a> [-p]</code>
161 <td>&mdash;
162 <td>&mdash;
163 <td><code>git checkout [-p]</code> / <code>git restore [-p]</code>
164 <tr>
165 <td><code><a href="got.1.html#revert">got revert</a> [-p]</code>
166 <td>&mdash;
167 <td><code>svn revert</code>
168 <td><code>git reset --hard</code>
169 <tr>
170 <td><code><a href="got.1.html#commit">got commit</a></code>
171 <td><code>cvs commit</code>
172 <td><code>svn commit</code>
173 <td><code>git commit <var>&lt;path&gt;</var></code> / <code>git commit -a</code>
174 <tr>
175 <td><code><a href="got.1.html#tag">got tag</a></code>
176 <td><code>cvs tag</code>
177 <td><code>svn copy</code>
178 <td><code>git tag</code>
179 <tr>
180 <td><code><a href="got.1.html#fetch">got fetch</a></code>
181 <td><code>cvsync</code> / <code>reposync</code>
182 <td><code>svnsync</code>
183 <td><code>git fetch</code>
184 <tr>
185 <td><code><a href="got.1.html#send">got send</a></code>
186 <td>&mdash;
187 <td>&mdash;
188 <td><code>git push</code>
189 <tr>
190 <td><code><a href="got.1.html#log">got log</a> -p</code>
191 <td>&mdash;
192 <td><code>svn log --diff</code>
193 <td><code>git log -p</code>
194 <tr>
195 <td><code><a href="got.1.html#blame">got blame</a></code>
196 <td><code>cvs blame</code>
197 <td><code>svn praise</code>
198 <td><code>git blame</code>
199 <tr>
200 <td><code><a href="got.1.html#tree">got tree</a></code>
201 <td>&mdash;
202 <td><code>svn list</code>
203 <td><code>git ls-tree</code>
204 <tr>
205 <td><code><a href="got.1.html#rebase">got rebase</a></code>
206 <td>&mdash;
207 <td>&mdash;
208 <td><code>git rebase</code>
209 <tr>
210 <td><code><a href="got.1.html#histedit">got histedit</a></code>
211 <td>&mdash;
212 <td>&mdash;
213 <td><code>git rebase -i</code>
214 <tr>
215 <td><code><a href="got.1.html#merge">got merge</a></code> <i>(2 parents)</i>
216 <td><code>cvs update -j -j</code>
217 <td><code>svn merge</code>
218 <td><code>git merge</code> <i>(up to N parents)</i>
219 <tr>
220 <td><code><a href="got.1.html#cherrypick">got cherrypick</a></code>
221 <td><code>cvs update -j -j</code>
222 <td><code>svn merge -c <var>&lt;rev&gt;</var></code>
223 <td><code>git cherry-pick</code>
224 <tr>
225 <td><code><a href="got.1.html#backout">got backout</a></code>
226 <td><code>cvs update -j -j</code>
227 <td><code>svn merge -c -<var>&lt;rev&gt;</var></code>
228 <td><code>git revert</code>
229 <tr>
230 <td><code><a href="tog.1.html">tog</a></code>
231 <td>&mdash;
232 <td>&mdash;
233 <td><code>tig</code>
234 <tr>
235 <td><code><a href="gotadmin.1.html#pack">gotadmin pack</a></code>
236 <td>&mdash;
237 <td><code>svnadmin pack</code>
238 <td><code>git repack</code>
239 <tr>
240 <td><code><a href="gotadmin.1.html#cleanup">gotadmin cleanup</a></code>
241 <td>&mdash;
242 <td><code>svnadmin cleanup</code>
243 <td><code>git gc</code>
244 </table>