libgit2 gitable链接库
| 建立状态 | |
|---|---|
| 主分支建立 | |
| v1.9分支机构 | |
| v1.8分支机构 | |
| 每晚建造 |
libgit2是一种可移植的,纯C实现,以固定API为链接的库提供的git核心方法,可以在您的应用程序中构建git功能。
libgit2用于各个地方,从GUI客户到托管提供商(“ Forges”)以及无数的公用事业以及两者之间的应用程序。因为它是用C编写的,所以可以通过“绑定”提供任何其他编程语言,因此您可以在Ruby,.Net,.net,Python,Node.js,Rust等中使用它。
libgit2经过非常宽松的许可(GPLV2,具有特殊链接例外)许可。这意味着您可以通过任何类型的软件链接在库中,而无需使该软件属于GPL。 libgit2的更改仍将在其GPL许可下涵盖。
目录
- 使用libgit2
- 快速开始
- 得到帮助
- 它可以做什么
- 可选依赖性
- 初始化
- 线程
- 会议
- 构建libgit2使用cmake
- 建筑
- 安装
- 高级用法
- 编译器和链接器选项
- macos
- ios
- 安卓
- 明格
- 语言绑定
- 我该如何贡献?
- 执照
使用libgit2
这些说明中的大多数都假定您是在C中编写的应用程序,并且想直接使用libgit2 。如果您不使用C,并且正在用不同的语言或平台编写。NET,Node.js或Ruby,那么您可能会有一种“语言绑定”,您可以用来照顾呼叫到本机代码的混乱任务。
但是,如果您想直接使用libgit2 – 因为您正在C中构建应用程序 – 那么您可能可以使用现有的二进制文件。 VCPKG和Conan软件包经理有包装。 libgit2在自制和大多数Linux发行版中可用。
但是,这些版本可能已过时,我们建议在可能的情况下使用最新版本。值得庆幸的是, libgit2并不难编译。
快速开始
建造libgit2的先决条件:
- CMAKE,建议安装到您的
PATH中。 - Python由我们的测试框架使用,应安装到您的
PATH中。 - C编译器: libgit2是C90,应在大多数编译器上进行编译。
- Windows:建议使用Visual Studio
- Mac:建议XCODE
- UNIX:建议使用GCC或Clang。
建造
- 在libgit2源目录下创建一个构建目录,然后更改为:
mkdir build && cd build - 创建CMAKE构建环境:
cmake .. - 构建libgit2 :
cmake --build .
这些步骤麻烦?阅读我们的故障排除指南。下面提供了更详细的构建指南。
得到帮助
与我们聊天
- 通过IRC:在Libera上加入# libgit2 。
- 通过Slack:访问Slack。 libgit2 .org注册,然后加入我们的
# libgit2
得到帮助
如果您对图书馆有疑问,请务必查看API文档。如果您仍然有疑问,请在Slack上与我们联系,或在Stackoverflow上发布一个问题(带有libgit2标签)。
报告错误
请打开一个GitHub问题,并提供尽可能多的信息。如果可能,请提供说明您看到的问题的示例代码。如果您仅在特定存储库上看到错误,请在可能的情况下提供链接。
我们要求您不为错误报告打开GitHub问题以寻求帮助。
报告安全问题
请查看Security.md。
它可以做什么
libgit2使您能够以您选择的编程语言管理GIT存储库。它在生产中用于为包括Github.com,塑料SCM和Azure DevOps在内的许多应用程序提供动力。
它不打算替换GIT工具或其面向用户的命令。某些API类似于管道命令,因为命令与GIT系统的概念紧密相符,但是用户输入的大多数命令都超出了该库直接实现的范围。
库提供:
- SHA转换,格式和缩短
- 摘要ODB后端系统
- 提交,标签,树和斑点解析,编辑和写作
- 树遍历
- 修订步行
- 索引文件(登台区)操纵
- 参考管理(包括包装参考)
- 配置文件管理
- 高级存储库管理
- 螺纹安全性和重新输入
- 描述性和详细错误消息
- …以及更多(超过175个不同的API呼叫)
由于libgit2纯粹是GIT系统的消费者,因此我们必须适应上游的变化。这有两个主要后果:
- 一些更改可能需要我们更改提供的界面。尽管我们尝试以通用的方式实施功能,以便不需要未来的更改,但我们不能承诺完全稳定的API。
- 由于我们必须跟上上游行为的变化,因此我们可能在某些领域落后。我们通常会在我们的问题跟踪器中使用标签“ git更改”来记录这些不兼容。
可选依赖性
尽管库提供的git功能很少,但一些推荐的依赖项用于性能或完整功能。
- 哈希生成:git使用sha1dc(碰撞检测SHA1)进行默认哈希生成。 SHA256支持是实验性的,并且MacOS和Windows上的系统库或UNIX系统上的HTTPS库提供了优化的支持。
- 线程:由Windows上的系统库以及UNIX系统上的Pthreads提供。
- HTTPS:由MACOS和Windows上的系统库,或其他UNIX系统上的OpenSSL或MBEDTL提供。
- SSH:由libssh2或通过调用Openssh提供。
- Unicode:由Windows和MacOS上的系统库提供。
初始化
图书馆需要跟踪某些全球状态。称呼
git_ libgit2 _init();
在调用任何其他libgit2函数之前。您可以多次调用此功能。匹配数量的电话
git_ libgit2 _shutdown();
将释放资源。请注意,如果您有工作线程,则应在这些线程退出后调用git_ libgit2 _shutdown 。如果您需要协调此事的协助,只需在启动时拨打git_ libgit2 _init ,然后在关闭时git_ libgit2 _shutdown即可。
线程
请参阅线程以获取信息
会议
有关我们使用的外部和内部API/编码约定的概述,请参见约定。
构建libgit2使用cmake
建筑
libgit2在大多数平台上构建,而没有任何外部依赖性作为要求。 libgit2是在所有平台上使用CMAKE(2.8版或更新)构建的。
在大多数系统上,您可以使用以下命令构建库
$ mkdir build && cd build
$ cmake ..
$ cmake --build .
要在构建中包含示例,请使用cmake -DBUILD_EXAMPLES=ON ..而不是cmake ..然后可以在build/examples中找到相对于Toplevel目录的构建可执行文件。
另外,您可以将CMAKE GUI工具指向CMakelists.txt文件,并生成平台特定的构建项目或IDE工作区。
如果您不熟悉CMAKE,则更详细的解释可能会有所帮助。
高级选项
您可以为cmake指定许多选项,这些选项将改变libgit2的构建方式。要使用此功能,请在初始cmake配置期间指定-Doption=value 。例如,启用SHA256兼容性:
$ mkdir build && cd build
$ cmake -DEXPERIMENTAL_SHA256=ON ..
$ cmake --build .
libgit2选项:
-
EXPERIMENTAL_SHA256=ON:打开sha256兼容性;请注意,这是一个不兼容的变化,因此为什么将其标记为“实验”
构建选项:
-
BUILD_EXAMPLES=ON:构建示例代码的套件 -
BUILD_FUZZERS=ON:构建模糊套件 -
ENABLE_WERROR=ON:使用-Werror或等效构建,这将编译器警告变成libgit2代码库中的错误(但不是其依赖关系)
依赖项选项:
-
USE_SSH=type:启用SSH支持并选择选择提供商;可以将type设置为libssh2或exec(将执行外部OpenSSH命令)。ONlibssh2的暗示;默认为OFF。 -
USE_HTTPS=type:启用HTTPS支持并选择选择提供商;可以将type设置为OpenSSL,OpenSSL-Dynamic(不要针对OpenSSL链接,而是动态加载它),SecureTransport,Schannel或WinHTTP;默认值是MacOS上的SecureTransport,Windows上的WinHTTP,以及在其他平台上检测到OpenSSL或mbedTLS的哪个。默认为ON。 -
USE_SHA1=type:选择要使用的SHA1机制;可以将type设置为CollisionDetection,HTTPS使用系统或HTTPS提供商,或OpenSSL,OpenSSL-Dynamic,OpenSSL-FIPS(在OpenSSL中使用符合FIPS的例程),CommonCrypto或Schannel。默认为CollisionDetection。保留此选项以使其向后兼容,不应更改。 -
USE_SHA256=type:选择要使用的SHA256机制;可以将type设置为HTTPS,以使用系统或HTTPS驱动程序,builtin或OpenSSL,OpenSSL-Dynamic,OpenSSL-FIPS(在OpenSSL中使用CommonCrypto或Schannel中使用FIPS符合FIPS的例程)。默认为HTTPS。 -
USE_GSSAPI=<on/off>:启用gssapi在unix上进行spnego身份验证。默认为OFF。 -
USE_HTTP_PARSER=type:选择HTTP解析器;外部http-parser依赖项的http-parser,llhttp的外部llhttp依赖关系,或者是builtin。默认为builtin。 -
REGEX_BACKEND=type:选择要使用的正则表达式后端;regcomp_l,pcre2,pcre,regcomp或builtin的之一。默认值是在可用的地方使用regcomp_l,如果发现pcre,否则使用内置素。 -
USE_BUNDLED_ZLIB=type:选择捆绑的zlib;ON或OFF。默认使用系统ZLIB(如果有),掉回捆绑的Zlib。
定位依赖项
libgit2项目使用cmake ,因为它有助于跨平台项目,尤其是具有许多依赖关系的项目。如果您的依赖项位于非标准位置,则可能需要使用_ROOT_DIR选项来指定其位置。例如,指定OpenSSL位置:
$ cmake -DOPENSSL_ROOT_DIR=/tmp/openssl-3.3.2 ..
由于这些选项是CMAKE的一般选择,因此它们的文档可能会有所帮助。如果您对依赖关系有疑问,请与我们联系。
运行测试
构建后,您可以使用命令从build目录中运行测试
$ ctest -V
或者,您可以直接使用
$ ./ libgit2 _tests
直接调用测试套件很有用,因为它允许您使用-s标志执行单个测试或测试组。例如,运行索引测试:
$ ./ libgit2 _tests -sindex
要运行一个名为index::racy::diff的单个测试,该测试对应于测试功能test_index_racy__diff :
$ ./ libgit2 _tests -sindex::racy::diff
测试套件将打印a .对于每个通过测试,以及用于任何失败测试的F S表示跳过了测试,因为它不适用于您的平台或特别昂贵。
注意:当您从发行版或主要分支中构建未修改的源树时,应该没有失败的测试。如果您看到测试失败,请与我们联系或打开问题。
安装
要安装库,您可以通过设置来指定安装前缀:
$ cmake .. -DCMAKE_INSTALL_PREFIX=/install/prefix
$ cmake --build . --target install
高级用法
有关更高级的使用或有关CMAKE的问题,请阅读CMAKE常见问题解答。
声明以下CMAKE变量:
-
CMAKE_INSTALL_BINDIR:在哪里安装二进制文件。 -
CMAKE_INSTALL_LIBDIR:在哪里安装库。 -
CMAKE_INSTALL_INCLUDEDIR:在哪里安装标题到达。 -
BUILD_SHARED_LIBS:构建libgit2作为共享库(默认为on) -
BUILD_TESTS:构建单元和集成测试套件(默认为ON) -
USE_THREADS:构建具有线程支持的libgit2 (默认为ON)
要列出所有构建选项及其当前价值,您可以执行以下操作:
# Create and set up a build directory
$ mkdir build && cd build
$ cmake ..
# List all build options and their values
$ cmake -L
编译器和链接器选项
有几个选项可以控制编译器和链接器的行为。这些标志可能对交叉兼容或专业设置有用。
-
CMAKE_C_FLAGS:设置自己的编译器标志 -
CMAKE_C_STANDARD:C汇编的C标准;默认为C90 -
CMAKE_C_EXTENSIONS:是否支持编译器扩展;默认为OFF -
CMAKE_FIND_ROOT_PATH:覆盖库的搜索路径 -
ZLIB_LIBRARY,OPENSSL_SSL_LIBRARY和OPENSSL_CRYPTO_LIBRARY:告诉cmake在哪里可以找到那些特定的库 -
LINK_WITH_STATIC_LIBRARIES:仅链接与系统库的静态版本
macos
如果您想使用Xcode,则可以使用“ -g Xcode”生成Xcode项目。
# Create and set up a build directory
$ mkdir build && cd build
$ cmake -G Xcode ..
提示
通用二进制支持:
如果要为MacOS 11.0+构建通用二进制文件,则CMAKE在配置时使用-DCMAKE_OSX_ARCHITECTURES=\"x86_64;arm64\"时,请为您设置所有功能。
[弃用]如果要为Mac OS X构建通用二进制文件(10.4.4〜10.6),则如果您使用-DCMAKE_OSX_ARCHITECTURES=\"i386;x86_64\"则CMAKE将其全部为您设置。
ios
- 获取iOS CMAKE工具链文件:
您可以使用iOS-cmake之类的预先存在的工具链文件或自己编写。
- 指定工具链和系统名称:
- cmake_toolchain_file变量指向iOS的工具链文件。
- CMAKE_SYSTEM_NAME应设置为iOS。
- 示例命令:
假设您使用的是iOS-cmake工具链,则该命令可能看起来像:
cmake -G Xcode -DCMAKE_TOOLCHAIN_FILE=path/to/ios.toolchain.cmake -DCMAKE_SYSTEM_NAME=iOS -DPLATFORM=OS64 ..
- 建立项目:
生成项目后,在Xcode中打开.xcodeproj文件,选择您的iOS设备或模拟器作为目标,然后构建项目。
安卓
使用make-standalone-toolchain.sh脚本从NDK提取工具链。可选地,在其内部交叉串联并安装OpenSSL。然后创建CMAKE工具链文件,该文件将路径配置为crossCompiler(替换{PATH} ,并完整的路径通往工具链):
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)
配置时,添加-DCMAKE_TOOLCHAIN_FILE={pathToToolchainFile}到cmake命令中。
明格
如果您想在启用SSH支持的MingW环境中构建库,则可能需要通过-DCMAKE_LIBRARY_PATH=\"${MINGW_PREFIX}/${MINGW_CHOST}/lib/\" flag在配置时cmake。这是因为CMAKE默认情况下找不到MingW文件夹中的Win32库,您可能会看到一条错误消息,说明CMAKE在配置过程中无法解决ws2_32库。
另一个选项是在配置之前安装msys2-w32api-runtime软件包。该软件包将Win32库安装到/usr/lib文件夹中,默认情况下,该文件夹被CMake识别为库路径。请注意,此软件包是针对MSYS子系统的,这与MINGW不同。
语言绑定
以下是当前可用的与libgit2绑定:
- C ++
- libqgit2,qt bindings https://projects.***kde.org/projects/playground/libs/libqgit2/repository/
- 鸡肉计划
- 鸡git https://wiki.c*a**ll-cc.org/egg/git
- d
- dlibgit https://github.c***om/s-ludwig/dlibgit
- 德尔菲
- gitfordelphi https://g*ith*ub.*com/libgit2/gitfordelphi
- libgit2 -delphi https://**github.c*om/todaysoftware/libgit2-delphi
- Erlang
- geef https://github.*c**om/carlosmn/geef
- 去
- git2go https://g*ithu*b.com*/libgit2/git2go
- gobject
- libgit2 -glib https://wiki.***gnome.org/projects/libgit2-glib
- 诡计
- Guile-Git https://git*lab.c**om/guile-git/guile-git
- 哈斯克尔
- hgit2 https://gi*t*h*ub.com/jwiegley/gitlib
- 爪哇
- 锯齿状https://gith*ub*.co*m/ethomson/jagged
- git24J https://github.*c**om/git24j/git24j
- JavaScript / WebAssembly(浏览器和nodejs)
- WASM-GIT https://git*hub*.c*om/petersalomonsen/wasm-git
- 朱莉娅
- libgit2 .jl https://gith*u*b.*com/julialang/julia/tree/master/master/stdlib/libgit2
- 卢阿
- luagit2 https://gi*th*u*b.com/libgit2/luagit2
- 。网
- libgit2 Sharp https://g*i*th*ub.com/libgit2/ libgit2 Sharp
- node.js
- Nodegit https://*gith*ub.*com/nodegit/nodegit
- Objective-C
- Objective-Git https://g*i*th*ub.com/libgit2/objective-git
- OCAML
- ocaml- libgit2 https://**git*hub.com/fxfactorial/ocaml-libgit2
- 鹦鹉虚拟机
- parrot- libgit2 https://g*ithub*.c*om/letolabs/parrot-libgit2
- 珀尔
- git-raw https://*github.*co*m/jacquesg/p5-git-raw
- Pharo Smalltalk
- libgit2 -pharo-Bindings https://githu***b.com/pharo-vcs/libgit2-pharo-bindings
- php
- php-git2 https://github.*c*o*m/rogergee/php-git2
- Python
- pygit2 https://g*i*th*ub.com/libgit2/pygit2
- r
- Gert https://docs.rope***nsci.org/gert
- git2r https://git*hu*b.co*m/ropensci/git2r
- 红宝石
- 坚固https://g*i*th*ub.com/libgit2/rugged
- 锈
- git2-rs https://*github.c**om/rust-lang/git2-rs
- 迅速
- SwiftGit2 https://gi*t*hub*.com/swiftgit2/swiftgit2
- TCL
- LG2 https://git*h*ub*.com/apnadkarni/tcl-libgit2
- 瓦拉
- libgit2 .vapi https://*g*ith*ub.com/apmasell/vapis/blob/master/libgit2.vapi
如果您启动另一种绑定到libgit2语言,请告诉我们,以便我们将其添加到列表中。
我该如何贡献?
我们欢迎新贡献者!我们有许多标记为“抢夺”和“简单修复”的问题,这些问题是跳入并开始的好地方。我们的杰出项目列表中有更多详细的信息。
请确保检查贡献指南,以了解我们的工作流程以及libgit2编码约定。
执照
libgit2处于GPL2之下,链接例外。这意味着您可以链接到任何程序,专有或开源的库;付费或免费。但是,如果您修改了libgit2本身,则必须将源分配给修改后的libgit2 。
请参阅复制文件以获取完整的许可文本。
