libgit2 v0.16.0

Hello everyone,

another minor libgit2 release is here, albeit slightly delayed. This
one ships from Brussels, damn it’s cold.

The release has been tagged at:

A dist package can be found at:

Updated documentation can be found at:

The full change log follows after the message.


libgit2 v0.16.0 “Dutch Fries”

This lovely and much delayed release of libgit2 ships from the cold city
of Brussels, which is currently hosting FOSDEM 2012.

There’s been plenty of changes since the latest stable release, here’s a
full summary:

  • Git Attributes support (see git2/attr.h)
    There is now support to efficiently parse and retrieve information
    from .gitattribute files in a repository. Note that this
    information is not yet used e.g. when checking out files.

  • .gitignore support
    Likewise, all the operations that are affected by .gitignore files
    now take into account the global, user and local ignores when
    skipping the relevant files.

  • Cleanup of the object ownership semantics
    The ownership semantics for all repository subparts (index, odb,
    config files, etc) has been redesigned. All these objects are now
    reference counted, and can be hot-swapped in the middle of
    execution, allowing for instance to add a working directory and an
    index to a repository that was previously opened as bare, or to
    change the source of the ODB objects after initialization.

    Consequently, the repository API has been simplified to remove all
    the `_openX` calls that allowed setting these subparts *before*
  • git_index_read_tree()
    Git trees can now be read into the index.

  • More reflog functionality
    The reference log has been optimized, and new API calls to rename
    and delete the logs for a reference have been added.

  • Rewrite of the References code with explicit ownership semantics
    The references code has been mostly rewritten to take into account
    the cases where another Git application was modifying a repository’s
    references while the Library was running.

    References are now explicitly loaded and free'd by the user, and
    they may be reloaded in the middle of execution if the user suspects
    that their values may have changed on disk. Despite the new
    ownership semantics, the references API stays the same.
  • Simplified the Remotes API
    Some of the more complex Remote calls have been refactored into
    higher level ones, to facilitate the usual fetch workflow of a

  • Greatly improved thread-safety
    The library no longer has race conditions when loading objects from
    the same ODB and different threads at the same time. There’s now
    full TLS support, even for error codes. When the library is built
    with THREADSAFE=1, the threading support must be globally
    initialized before it can be used (see git_threads_init())

  • Tree walking API
    A new API can recursively traverse trees and subtrees issuing callbacks for
    every single entry.

  • Tree diff API
    There is basic support for diff’ing an index against two trees.

  • Improved windows support
    The Library is now codepage aware under Windows32: new API calls
    allow the user to set the default codepage for the OS in order to
    avoid strange Unicode errors.

Vicent Marti wrote on 05 Feb 2012