Encode and decode JSON files as Git tree objects.
This is an experimental developer preview release.
The latest release is available on PyPI and can be installed using
pip
:
$ pip install git-json-tree
The development version can be installed directly from the Git repository:
$ pip install -e git+https://github.com/jirikuncar/git-json-tree.git#egg=git-json-tree
Move to a repository where you would like to store JSON files and add following lines to files:
.git/config
[filter "git-json-tree"]
smudge = "git-json-tree smudge"
clean = "git-json-tree clean"
required # optional
.gitattributes
*.json filter=git-json-tree
Git Git-JSON-Tree's pointer file looks like this:
version https://github.com/jirikuncar/git-json-tree/tree/v1
oid sha1:2f769492d6b634b86b82e916630da8a693e9c20e
size 12345
It tracks the version of Git-JSON-Tree you're using, followed by a unique identifier for the JSON file (oid). It also stores the size of the target JSON file.
- NOTE:
size
is calculated from the encoded JSON string and it might differ depending on the version of serializer.
Interaction with the storage can also take place via the command-line interface (CLI).
First, you need to make sure that you are in a Git repository or you know its location. The example shows a case when you are in the directory with a Git repository.
$ echo '{"hello": "world", "version": 1}' | git-json-tree encode
7123db01ad8c75a8df3508305bd891317ea36feb
Following the above example you can create a first commit of your JSON object.
$ export FIRST=$(git commit-tree 7123db01 -m First)
It is quite impractical to remember tree or commit sha1, hence we can give it
a reference name. The next steps uses the name master
, but you can decide
to use your own naming convention for tracking versions of your objects. Each
file can have its own branch or just a single tag.
$ git update-ref refs/heads/master $FIRST # for new object
Storing a new version is very simple too.
$ export PARENT=$(git show-ref --hash refs/heads/master)
$ echo '{"hello": "world", "version": 2}' | git-json-tree encode
6f36c4272e88b14ab5e25a5419599534504c70fc
$ export SECOND=$(git commit-tree 6f36c4272e -m Second -p $PARENT)
$ git update-ref refs/heads/master $SECOND
Finally, you can retrive and decode a tree or commit.
$ git-json-tree decode # HEAD
$ git-json-tree decode $FIRST # commit
$ git-json-tree decode 7123db01 # tree id