libgit2

1.9.0

A cross-platform, linkable library implementation of Git that you can use in your application.
libgit2/libgit2

What's New

libgit2 v1.9.0

2024-12-28T15:14:41Z

This is release v1.9.0, "Schwibbogen". As usual, it contains numerous bug fixes, compatibility improvements, and new features.

This is expected to be the final release in the libgit2 v1.x lineage. libgit2 v2.0 is expected to be the next version, with support for SHA256 moving to "supported" status (out of "experimental" status). This means that v2.0 will have API and ABI changes to support SHA256, as well as other breaking changes.

Major changes

  • Documentation improvements
    We've launched a new website for our API reference docs at https://libgit2.org/docs/reference/main. To support this, we've updated the documentation to ensure that all APIs are well-documented, and added docurium-style specifiers to indicate more depth about the API surface.

    We now also publish a JSON blob with the API structure and the documentation that may be helpful for binding authors.

  • TLS cipher updates
    libgit2 has updated our TLS cipher selection to match the "compatibility" cipher suite settings as documented by Mozilla.

  • Blame improvements
    The blame API now contains committer information and commit summaries for blame hunks, and the ability to get information about the line of text that was modified. In addition, a CLI blame command has been added so that the blame functionality can be benchmarked by our benchmark suite.

  • More CLI commands
    libgit2 has added blame and init commands, which have allowed for further benchmarking and several API improvements and git compatibility updates.

  • Warning when configuring without SHA1DC
    Users are encouraged to use SHA1DC, which is git's hash; users should not use SHA1 in the general case. Users will now be warned if they try to configure cmake with a SHA1 backend (-DUSE_SHA1=...).

Breaking changes

There are several ABI-breaking changes that integrators, particularly maintainers of bindings or FFI users, may want to be aware of.

  • Blame hunk structure updates (ABI breaking change)
    There are numerous additions to the git_blame_hunk structure to accommodate more information about the blame process.

  • Checkout strategy updates (ABI breaking change)
    The values for GIT_CHECKOUT_SAFE and GIT_CHECKOUT_NONE have been updated. GIT_CHECKOUT_SAFE is now 0; this was implicitly the default value (with the options constructors setting that as the checkout strategy). It is now the default if the checkout strategy is set to 0. This allows for an overall code simplification in the library.

  • Configuration entry member removal (ABI breaking change)
    The git_config_entry structure no longer contains a free member; this was an oversight as end-users should not try to free that structure.

  • Configuration backend function changes (ABI breaking change)
    git_config_backends should now return git_config_backend_entry objects instead of git_config_entry objects. This allows backends to provide a mechanism to nicely free the configuration entries that they provide.

  • update_refs callback for remotes (ABI breaking change)
    The update_refs callback was added to the git_remote_callbacks structure to provide additional information about updated refs; in particular, the git_refspec is included for more information about the remote ref. The update_refs callback will be preferred over the now deprecated update_tips callback.

What's Changed

New features

  • The git_signature_default_from_env API will now produce a pair of git_signatures representing the author, and the committer, taking the GIT_AUTHOR_NAME and GIT_COMMITTER_NAME environment variables into account. Added by @u-quark in #6706

  • packbuilder can now be interrupted from a callback. Added @roberth in #6874

  • libgit2 now claims to honor the preciousObject repository extension. This extension indicates that the client will never delete objects (in other words, will not garbage collect). libgit2 has no functionality to remove objects, so it implicitly obeys this in all cases. Added by @ethomson in #6886

  • Push status will be reported even when a push fails. This is useful to give information from the server about possible updates, even when the overall status failed. Added by @yerseg in #6876

  • You can now generate a thin pack from a mempack instance using git_mempack_write_thin_pack. Added by @roberth in #6875

  • The new LIBGIT2_VERSION_CHECK macro will indicate whether the version of libgit2 being compiled against is at least the version specified. For example: #if LIBGIT2_VERSION_CHECK(1, 6, 3) is true for libgit2 version 1.6.3 or newer. In addition, the new LIBGIT2_VERSION_NUMBER macro will return an integer version representing the libgit2 version number. For example, for version 1.6.3, LIBGIT2_VERSION_NUMBER will evaluate to 010603. Added by @HamedMasafi in #6882

  • Custom X509 certificates can be added to OpenSSL's certificate store using the GIT_OPT_ADD_SSL_X509_CERT option. Added by @yerseg in #6877

  • The libgit2 compatibility CLI now has a git blame command. Added by @ethomson in #6907

  • Remote callbacks now provide an update_refs callback so that users can now get the refspec of the updated reference during push. This gives more complete information about the remote reference that was updated. Added by @ethomson in #6559

  • An optional FIPS-compliant mode for hashing is now available; you can set -DUSE_SHA256=OpenSSL-FIPS to enable it. Added by @marcind-dot in #6906

  • The git-compatible CLI now supports the git init command, which has been useful in identifying API improvements and incompatibilities with git. Added by @ethomson in #6984

  • Consumers can now query more information about how libgit2 was compiled, and query the "backends" that libgit2 uses. Added by @ethomson in #6971

Bug fixes

  • Fix constness issue introduced in #6716 by @ethomson in #6829
  • odb: conditional git_hash_ctx_cleanup in git_odb_stream by @gensmusic in #6836
  • Fix shallow root maintenance during fetch by @kcsaul in #6846
  • Headers cleanup by @anatol in #6842
  • http: Initialize on_status when using the http-parser backend by @civodul in #6870
  • Leak in truncate_racily_clean in index.c by @lstoppa in #6884
  • ssh: Omit port option from ssh command unless specified in remote url by @jayong93 in #6845
  • diff: print the file header on GIT_DIFF_FORMAT_PATCH_HEADER by @carlosmn in #6888
  • Add more robust reporting to SecureTransport errors on macos by @vcfxb in #6848
  • transport: do not filter tags based on ref dir in local by @rindeal in #6881
  • push: handle tags to blobs by @ethomson in #6898
  • Fixes for OpenSSL dynamic by @ethomson in #6901
  • realpath: unbreak build on OpenBSD by @ajacoutot in #6932
  • util/win32: Continue if access is denied when deleting a folder by @lrm29 in #6929
  • object: git_object_short_id fails with core.abbrev string values by @lrm29 in #6944
  • Clear data after negotiation by @lrm29 in #6947
  • smart: ignore shallow/unshallow packets during ACK processing by @kempniu in #6973

Security fixes

  • ssh: Include rsa-sha2-256 and rsa-sha2-512 in the list of hostkey types by @lrm29 in #6938
  • TLS: v1.2 and updated cipher list by @ethomson in #6960

Code cleanups

Benchmarks

Build and CI improvements

Documentation improvements

Git compatibility fixes

  • Limit .gitattributes and .gitignore files to 100 MiB by @csware in #6834
  • refs: Handle normalizing negative refspecs by @ryan-ph in #6951
  • repo: put a newline on the .git link file by @ethomson in #6981

Dependency updates

Other changes

New Contributors

Full Changelog: v1.8.4...v1.9.0

libgit2 - the Git linkable library

OpenSSF Best Practices

Build Status
main branch builds CI Build Experimental Features
v1.9 branch builds CI Build Experimental Features
v1.8 branch builds CI Build Experimental Features
Nightly builds Nightly Build Coverity Scan Status

libgit2 is a portable, pure C implementation of the Git core methods provided as a linkable library with a solid API, allowing to build Git functionality into your application.

libgit2 is used in a variety of places, from GUI clients to hosting providers ("forges") and countless utilities and applications in between. Because it's written in C, it can be made available to any other programming language through "bindings", so you can use it in Ruby, .NET, Python, Node.js, Rust, and more.

libgit2 is licensed under a very permissive license (GPLv2 with a special Linking Exception). This means that you can link against the library with any kind of software without making that software fall under the GPL. Changes to libgit2 would still be covered under its GPL license.

Table of Contents

Using libgit2

Most of these instructions assume that you're writing an application in C and want to use libgit2 directly. If you're not using C, and you're writing in a different language or platform like .NET, Node.js, or Ruby, then there is probably a "language binding" that you can use to take care of the messy tasks of calling into native code.

But if you do want to use libgit2 directly - because you're building an application in C - then you may be able use an existing binary. There are packages for the vcpkg and conan package managers. And libgit2 is available in Homebrew and most Linux distributions.

However, these versions may be outdated and we recommend using the latest version if possible. Thankfully libgit2 is not hard to compile.

Quick Start

Prerequisites for building libgit2:

  1. CMake, and is recommended to be installed into your PATH.
  2. Python is used by our test framework, and should be installed into your PATH.
  3. C compiler: libgit2 is C90 and should compile on most compilers.
    • Windows: Visual Studio is recommended
    • Mac: Xcode is recommended
    • Unix: gcc or clang is recommended.

Build

  1. Create a build directory beneath the libgit2 source directory, and change into it: mkdir build && cd build
  2. Create the cmake build environment: cmake ..
  3. Build libgit2: cmake --build .

Trouble with these steps? Read our troubleshooting guide. More detailed build guidance is available below.

Getting Help

Chat with us

Getting Help

If you have questions about the library, please be sure to check out the API documentation. If you still have questions, reach out to us on Slack or post a question on StackOverflow (with the libgit2 tag).

Reporting Bugs

Please open a GitHub Issue and include as much information as possible. If possible, provide sample code that illustrates the problem you're seeing. If you're seeing a bug only on a specific repository, please provide a link to it if possible.

We ask that you not open a GitHub Issue for help, only for bug reports.

Reporting Security Issues

Please have a look at SECURITY.md.

What It Can Do

libgit2 provides you with the ability to manage Git repositories in the programming language of your choice. It's used in production to power many applications including GitHub.com, Plastic SCM and Azure DevOps.

It does not aim to replace the git tool or its user-facing commands. Some APIs resemble the plumbing commands as those align closely with the concepts of the Git system, but most commands a user would type are out of scope for this library to implement directly.

The library provides:

  • SHA conversions, formatting and shortening
  • abstracted ODB backend system
  • commit, tag, tree and blob parsing, editing, and write-back
  • tree traversal
  • revision walking
  • index file (staging area) manipulation
  • reference management (including packed references)
  • config file management
  • high level repository management
  • thread safety and reentrancy
  • descriptive and detailed error messages
  • ...and more (over 175 different API calls)

As libgit2 is purely a consumer of the Git system, we have to adjust to changes made upstream. This has two major consequences:

  • Some changes may require us to change provided interfaces. While we try to implement functions in a generic way so that no future changes are required, we cannot promise a completely stable API.
  • As we have to keep up with changes in behavior made upstream, we may lag behind in some areas. We usually to document these incompatibilities in our issue tracker with the label "git change".

Optional dependencies

While the library provides git functionality with very few dependencies, some recommended dependencies are used for performance or complete functionality.

  • Hash generation: Git uses SHA1DC (collision detecting SHA1) for its default hash generation. SHA256 support is experimental, and optimized support is provided by system libraries on macOS and Windows, or by the HTTPS library on Unix systems when available.
  • Threading: is provided by the system libraries on Windows, and pthreads on Unix systems.
  • HTTPS: is provided by the system libraries on macOS and Windows, or by OpenSSL or mbedTLS on other Unix systems.
  • SSH: is provided by libssh2 or by invoking OpenSSH.
  • Unicode: is provided by the system libraries on Windows and macOS.

Initialization

The library needs to keep track of some global state. Call

git_libgit2_init();

before calling any other libgit2 functions. You can call this function many times. A matching number of calls to

git_libgit2_shutdown();

will free the resources. Note that if you have worker threads, you should call git_libgit2_shutdown after those threads have exited. If you require assistance coordinating this, simply have the worker threads call git_libgit2_init at startup and git_libgit2_shutdown at shutdown.

Threading

See threading for information

Conventions

See conventions for an overview of the external and internal API/coding conventions we use.

Building libgit2 - Using CMake

Building

libgit2 builds cleanly on most platforms without any external dependencies as a requirement. libgit2 is built using CMake (version 2.8 or newer) on all platforms.

On most systems you can build the library using the following commands

$ mkdir build && cd build
$ cmake ..
$ cmake --build .

To include the examples in the build, use cmake -DBUILD_EXAMPLES=ON .. instead of cmake ... The built executable for the examples can then be found in build/examples, relative to the toplevel directory.

Alternatively you can point the CMake GUI tool to the CMakeLists.txt file and generate platform specific build project or IDE workspace.

If you're not familiar with CMake, a more detailed explanation may be helpful.

Advanced Options

You can specify a number of options to cmake that will change the way libgit2 is built. To use this, specify -Doption=value during the initial cmake configuration. For example, to enable SHA256 compatibility:

$ mkdir build && cd build
$ cmake -DEXPERIMENTAL_SHA256=ON ..
$ cmake --build .

libgit2 options:

  • EXPERIMENTAL_SHA256=ON: turns on SHA256 compatibility; note that this is an API-incompatible change, hence why it is labeled "experimental"

Build options:

  • BUILD_EXAMPLES=ON: builds the suite of example code
  • BUILD_FUZZERS=ON: builds the fuzzing suite
  • ENABLE_WERROR=ON: build with -Werror or the equivalent, which turns compiler warnings into errors in the libgit2 codebase (but not its dependencies)

Dependency options:

  • USE_SSH=type: enables SSH support and optionally selects the provider; type can be set to libssh2 or exec (which will execute an external OpenSSH command). ON implies libssh2; defaults to OFF.
  • USE_HTTPS=type: enables HTTPS support and optionally selects the provider; type can be set to OpenSSL, OpenSSL-Dynamic (to not link against OpenSSL, but load it dynamically), SecureTransport, Schannel or WinHTTP; the default is SecureTransport on macOS, WinHTTP on Windows, and whichever of OpenSSL or mbedTLS is detected on other platforms. Defaults to ON.
  • USE_SHA1=type: selects the SHA1 mechanism to use; type can be set to CollisionDetection, HTTPS to use the system or HTTPS provider, or one of OpenSSL, OpenSSL-Dynamic, OpenSSL-FIPS (to use FIPS compliant routines in OpenSSL), CommonCrypto, or Schannel. Defaults to CollisionDetection. This option is retained for backward compatibility and should not be changed.
  • USE_SHA256=type: selects the SHA256 mechanism to use; type can be set to HTTPS to use the system or HTTPS driver, builtin, or one of OpenSSL, OpenSSL-Dynamic, OpenSSL-FIPS (to use FIPS compliant routines in OpenSSL), CommonCrypto, or Schannel. Defaults to HTTPS.
  • USE_GSSAPI=<on/off>: enables GSSAPI for SPNEGO authentication on Unix. Defaults to OFF.
  • USE_HTTP_PARSER=type: selects the HTTP Parser; either http-parser for an external http-parser dependency, llhttp for an external llhttp dependency, or builtin. Defaults to builtin.
  • REGEX_BACKEND=type: selects the regular expression backend to use; one of regcomp_l, pcre2, pcre, regcomp, or builtin. The default is to use regcomp_l where available, PCRE if found, otherwise, to use the builtin.
  • USE_BUNDLED_ZLIB=type: selects the bundled zlib; either ON or OFF. Defaults to using the system zlib if available, falling back to the bundled zlib.

Locating Dependencies

The libgit2 project uses cmake since it helps with cross-platform projects, especially those with many dependencies. If your dependencies are in non-standard places, you may want to use the _ROOT_DIR options to specify their location. For example, to specify an OpenSSL location:

$ cmake -DOPENSSL_ROOT_DIR=/tmp/openssl-3.3.2 ..

Since these options are general to CMake, their documentation may be helpful. If you have questions about dependencies, please contact us.

Running Tests

Once built, you can run the tests from the build directory with the command

$ ctest -V

Alternatively you can run the test suite directly using,

$ ./libgit2_tests

Invoking the test suite directly is useful because it allows you to execute individual tests, or groups of tests using the -s flag. For example, to run the index tests:

$ ./libgit2_tests -sindex

To run a single test named index::racy::diff, which corresponds to the test function test_index_racy__diff:

$ ./libgit2_tests -sindex::racy::diff

The test suite will print a . for every passing test, and an F for any failing test. An S indicates that a test was skipped because it is not applicable to your platform or is particularly expensive.

Note: There should be no failing tests when you build an unmodified source tree from a release, or from the main branch. Please contact us or open an issue if you see test failures.

Installation

To install the library you can specify the install prefix by setting:

$ cmake .. -DCMAKE_INSTALL_PREFIX=/install/prefix
$ cmake --build . --target install

Advanced Usage

For more advanced use or questions about CMake please read the CMake FAQ.

The following CMake variables are declared:

  • CMAKE_INSTALL_BINDIR: Where to install binaries to.
  • CMAKE_INSTALL_LIBDIR: Where to install libraries to.
  • CMAKE_INSTALL_INCLUDEDIR: Where to install headers to.
  • BUILD_SHARED_LIBS: Build libgit2 as a Shared Library (defaults to ON)
  • BUILD_TESTS: Build the unit and integration test suites (defaults to ON)
  • USE_THREADS: Build libgit2 with threading support (defaults to ON)

To list all build options and their current value, you can do the following:

# Create and set up a build directory
$ mkdir build && cd build
$ cmake ..

# List all build options and their values
$ cmake -L

Compiler and linker options

There are several options that control the behavior of the compiler and linker. These flags may be useful for cross-compilation or specialized setups.

  • CMAKE_C_FLAGS: Set your own compiler flags
  • CMAKE_C_STANDARD: the C standard to compile against; defaults to C90
  • CMAKE_C_EXTENSIONS: whether compiler extensions are supported; defaults to OFF
  • CMAKE_FIND_ROOT_PATH: Override the search path for libraries
  • ZLIB_LIBRARY, OPENSSL_SSL_LIBRARY AND OPENSSL_CRYPTO_LIBRARY: Tell CMake where to find those specific libraries
  • LINK_WITH_STATIC_LIBRARIES: Link only with static versions of system libraries

macOS

If you'd like to work with Xcode, you can generate an Xcode project with "-G Xcode".

# Create and set up a build directory
$ mkdir build && cd build
$ cmake -G Xcode ..

Tip

Universal binary support:

If you want to build a universal binary for macOS 11.0+, CMake sets it all up for you if you use -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" when configuring.

[Deprecated] If you want to build a universal binary for Mac OS X (10.4.4 ~ 10.6), CMake sets it all up for you if you use -DCMAKE_OSX_ARCHITECTURES="i386;x86_64" when configuring.

iOS

  1. Get an iOS cmake toolchain File:

You can use a pre-existing toolchain file like ios-cmake or write your own.

  1. Specify the toolchain and system Name:
  • The CMAKE_TOOLCHAIN_FILE variable points to the toolchain file for iOS.
  • The CMAKE_SYSTEM_NAME should be set to iOS.
  1. Example Command:

Assuming you're using the ios-cmake toolchain, the command might look like this:

cmake -G Xcode -DCMAKE_TOOLCHAIN_FILE=path/to/ios.toolchain.cmake -DCMAKE_SYSTEM_NAME=iOS -DPLATFORM=OS64 ..
  1. Build the Project:

After generating the project, open the .xcodeproj file in Xcode, select your iOS device or simulator as the target, and build your project.

Android

Extract toolchain from NDK using, make-standalone-toolchain.sh script. Optionally, crosscompile and install OpenSSL inside of it. Then create CMake toolchain file that configures paths to your crosscompiler (substitute {PATH} with full path to the toolchain):

SET(CMAKE_SYSTEM_NAME Linux)
SET(CMAKE_SYSTEM_VERSION Android)

SET(CMAKE_C_COMPILER   {PATH}/bin/arm-linux-androideabi-gcc)
SET(CMAKE_CXX_COMPILER {PATH}/bin/arm-linux-androideabi-g++)
SET(CMAKE_FIND_ROOT_PATH {PATH}/sysroot/)

SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

Add -DCMAKE_TOOLCHAIN_FILE={pathToToolchainFile} to cmake command when configuring.

MinGW

If you want to build the library in MinGW environment with SSH support enabled, you may need to pass -DCMAKE_LIBRARY_PATH="${MINGW_PREFIX}/${MINGW_CHOST}/lib/" flag to CMake when configuring. This is because CMake cannot find the Win32 libraries in MinGW folders by default and you might see an error message stating that CMake could not resolve ws2_32 library during configuration.

Another option would be to install msys2-w32api-runtime package before configuring. This package installs the Win32 libraries into /usr/lib folder which is by default recognized as the library path by CMake. Please note though that this package is meant for MSYS subsystem which is different from MinGW.

Language Bindings

Here are the bindings to libgit2 that are currently available:

If you start another language binding to libgit2, please let us know so we can add it to the list.

How Can I Contribute?

We welcome new contributors! We have a number of issues marked as "up for grabs" and "easy fix" that are good places to jump in and get started. There's much more detailed information in our list of outstanding projects.

Please be sure to check the contribution guidelines to understand our workflow, and the libgit2 coding conventions.

License

libgit2 is under GPL2 with linking exception. This means you can link to and use the library from any program, proprietary or open source; paid or gratis. However, if you modify libgit2 itself, you must distribute the source to your modified version of libgit2.

See the COPYING file for the full license text.

Description

  • Swift Tools
View More Packages from this Author

Dependencies

  • None
Last updated: Fri May 23 2025 08:21:57 GMT-0900 (Hawaii-Aleutian Daylight Time)