Like Git, but with an 'o'
Got is version control, with a model similar to Git's. A solution to the problems that come from using Git to store all of your data. Got uses an improved data structure that better handles large files and directories, and encrypts all the data that you give it.
- Content-Defined chunking of large files into blobs with a maximum size.
- E2E encryption. Branch names, directory names, file names, and file sizes can all be hidden from remote repositories.
- Efficiently add/remove large files and directories to/from existing filesystems.
- Stage changes with
add,rm,put, anddiscardcommands. - Inspect branch state with
catandls. - Print and change the active branch with
activecommand. - Commit changes, with
commit. - Create, delete, and list branches with
branchcommands. - Copy one branch state to another with
sync. - Share repositories using the Blobcache protocol with
servecommand. - Efficiently pack many small files into fewer blobs.
- Checkout the head of a branch to the working directory.
- Merge 2 branches.
Either download a prebuilt binary or build one from source.
Installs to $GOPATH/bin with just.
If that isn't on your path, just copy the executable from there to wherever you want.
$ just installThen initialize a repository in the current working directory.
Make sure you cd to where you want the repository.
$ got initThat will create a new repo using an in-process blobcache.
All content will be stored in the .got/blobcache directory.
This is the recommended way to try out blobcache.
A repo can also be initially configured to use the system (or any) blobcache instance. There are two ways to do this:
- Using BCP with
got init --blobcache-remote <bcp endpoint> - Using HTTP with
got init --blobcache-http <http endpoint>
For large repositories, it is recommended to use an out of process blobcache
The HTTP endpoint should just work, the BCP endpoint requires granting access to Got.
We use just as a command runner.
All of the common development tasks have just commands.
To run the tests:
$ just testTo build release binaries
TAG=v0.0.x just buildWhere TAG is an environment variable which should be set to the release version, or the Git hash of the source used for the build.
The release binaries will be under the out directory.
Got importing a 3GB file.
$ got add large_file.dat
[1.608s]
[1.564s] large_file.dat data_in=(1.24GB Δ=799.35MB/s)
[1.564s] worker-0 blobs_in=(182blobs Δ=117.26blobs/s), data_in=(157.09MB Δ=101.21MB/s)
[1.564s] worker-1 blobs_in=(197blobs Δ=127.43blobs/s), data_in=(158.19MB Δ=102.33MB/s)
[1.564s] worker-2 blobs_in=(181blobs Δ=116.50blobs/s), data_in=(154.83MB Δ=99.66MB/s)
[1.564s] worker-3 blobs_in=(172blobs Δ=112.63blobs/s), data_in=(154.01MB Δ=100.85MB/s)
[1.564s] worker-4 blobs_in=(179blobs Δ=116.82blobs/s), data_in=(157.34MB Δ=102.68MB/s)
[1.564s] worker-5 blobs_in=(177blobs Δ=115.36blobs/s), data_in=(156.12MB Δ=101.75MB/s)
[1.564s] worker-6 blobs_in=(199blobs Δ=130.09blobs/s), data_in=(155.20MB Δ=101.46MB/s)
[1.564s] worker-7 blobs_in=(161blobs Δ=104.50blobs/s), data_in=(150.69MB Δ=97.81MB/s)Read more about the configuration objects in doc/Config.md.
Support and development discussion happen in the INET256 discord.