Ben Straub

libgit2: The Repository

In libgit2, the git_repository object is the gateway to getting interesting stuff out of git. There are several ways to get your hands on one.

Clone

If your repository exists on a remote but not on the local machine, you can get it using git_clone, and once it’s done with all the network stuff, it spits out a repository object. Check out my post on cloning for more on that.

Discover

If you know a particular directory is a git repository, you can just hand the path to git_repository_open. The path can be to a bare repository, a .git folder, or a working directory.

git_repository *repo;
int error = git_repository_open(
  &repo,
  "/path/to/repository/on/disk");

In classic C fashion, libgit2 APIs generally return 0 on success, and a negative error code on failure. Occasionally the API documentation will mention the specific error codes that will come back, but you can always check the error header for the values.

If all you have is a path that you think is controlled by git, you can let libgit2 walk the directory structure to find it’s owning repository (if there is one). This approach works well if your application is dealing primarily with documents, like a text editor.

char path[1024];
if (0 == git_repository_discover(
  path, 1024,                       // buffer & size
  "/path/to/a/controlled/file.md",  // where to start
  true,                             // across filesystems?
  "/path"))                         // where to stop
{
  git_repository *repo;
  error = git_repository_open(&repo, path);
}

Initialize

If you want to create a new repository, git_repository_init is the call for you.

git_repository *repo;
int error = git_repository_init(
  &repo,                // output
  "path/to/new/repo",   // path
  false);               // bare?

This is kind of like running git init from the command line. If you need more control, you’ll use git_repository_init_ext:

git_repository *repo;
git_repository_init_options options =
  GIT_REPOSITORY_INIT_OPTIONS_INIT;
// ... (configure options)
int error = git_repository_init_ext(
  &repo,                // output
  "/path/to/new/repo",  // path
  &options);            // options

The signature itself looks similar to the simpler version, but that options structure exposes lots of behavior. Things like:

  • separating your .git directory from the workdir
  • adding a description or using a template
  • setting the initial branch name

Unfortunately, as of this writing the documentation parser doesn’t output structure-field comment-docs, but the header is pretty helpful.