One of my ref transaction aims is to make define a stable public API
for accessing refs.
Once this is done I want to make it possible to replace the current
.git/refs/* model with a
different type of backend.
In my case I want to add support to store all refs and reflogs in a TDB database
but once we have a pluggable backend framework for refs, if someone
wants to store the refs
in a SQL database, that should be fairly trivial too.

There are a few series queued before this becomes possible, but is
anyone wants to test or play with my "git can use TDB database" you
can find an implementation of this at

Most everything works (except submodules) but the code needs more work.
It is also VERY LIKELY that the database schema WILL CHANGE so this is
only for testing
and you will need to blow the repo away and start all over again at some stage.
I.e. no production use.

To activate TDB support a new flag is added to the init-db and clone commands:

git init --tdb-repo-name=RONNIE .

This creates a new git repo and sets core.tdb_repo_name in the config.
This config variable tells git to dlopen and use libtdb instead of
using the files under .git/refs

repo-name=RONNIE is a string that identifies the repository and all
keys in the database is prefixed
with repo-name + '\0'

By default this will create the two database refs.tdb and logs.tdb in
the repositories .git directory
but it is also possible to store the databases somehwere else by
adding --tdb-repo-dir=/var/lib/git/
when creating the repo.

Since the keys in the database are prefixed with the repo name it is
even possible to store all the
refs for multiple independent repos in the same database :

- First repository
  $ cd <somewhere>
  $ git init-db --tdb-repo-name=MyFirstRepo --tdb-repo-dir=/var/lib/git

- Second repository
  $ cd <somewhere else>
  $ git init-db --tdb-repo-name=MySecondRepo --tdb-repo-dir=/var/lib/git

This can also be a solutions for platforms lacking case sensitive
filesystems where today two refs that only differ in case can not be

The current prototype will still apply the naming collision rules that
the existing files backend has.
For example if you have a ref 'm'  you can not create another ref 'm/foo'.
I left those checks as is in order to not break compatibility between
the TDB backend and the current Files backend.

Please feel free to test this out. And comment.

ronnie sahlberg
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to
More majordomo info at

Reply via email to