1679133267
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. Language bindings like Rugged (Ruby), LibGit2Sharp (.NET), pygit2 (Python) and NodeGit (Node) allow you to build Git tooling in your favorite language.
libgit2
is used to power Git GUI clients like GitKraken and gmaster and on Git hosting providers like GitHub, GitLab and Azure DevOps. We perform the merge every time you click "merge pull request".
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. Additionally, the example code has been released to the public domain (see the separate license for more information).
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:
PATH
.PATH
.Build
mkdir build && cd build
cmake ..
cmake --build .
Trouble with these steps? Read our troubleshooting guide. More detailed build guidance is available below.
Getting Help
Chat with us
#libgit2
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:
As libgit2 is purely a consumer of the Git system, we have to adjust to changes made upstream. This has two major consequences:
Optional dependencies
While the library provides git functionality without the need for dependencies, it can make use of a few libraries to add to it:
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
libgit2
builds cleanly on most platforms without any external dependencies. Under Unix-like systems, like Linux, *BSD and Mac OS X, libgit2 expects pthreads
to be available; they should be installed by default on all systems. Under Windows, libgit2 uses the native Windows API for threading.
The libgit2
library 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 .
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.
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.
To install the library you can specify the install prefix by setting:
$ cmake .. -DCMAKE_INSTALL_PREFIX=/install/prefix
$ cmake --build . --target install
For more advanced use or questions about CMake please read https://cmake.org/Wiki/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
$ cmake ..
# List all build options and their values
$ cmake -L
CMake lets you specify a few variables to control the behavior of the compiler and linker. These flags are rarely used but can be useful for 64-bit to 32-bit cross-compilation.
CMAKE_C_FLAGS
: Set your own compiler flagsCMAKE_FIND_ROOT_PATH
: Override the search path for librariesZLIB_LIBRARY
, OPENSSL_SSL_LIBRARY
AND OPENSSL_CRYPTO_LIBRARY
: Tell CMake where to find those specific librariesLINK_WITH_STATIC_LIBRARIES
: Link only with static versions of system librariesIf you want to build a universal binary for Mac OS X, CMake sets it all up for you if you use -DCMAKE_OSX_ARCHITECTURES="i386;x86_64"
when configuring.
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.
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.
Author: libgit2
Source Code: https://github.com/libgit2/libgit2
License: View license
#c #git #library #versioncontrols #hacktoberfest
1679133267
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. Language bindings like Rugged (Ruby), LibGit2Sharp (.NET), pygit2 (Python) and NodeGit (Node) allow you to build Git tooling in your favorite language.
libgit2
is used to power Git GUI clients like GitKraken and gmaster and on Git hosting providers like GitHub, GitLab and Azure DevOps. We perform the merge every time you click "merge pull request".
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. Additionally, the example code has been released to the public domain (see the separate license for more information).
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:
PATH
.PATH
.Build
mkdir build && cd build
cmake ..
cmake --build .
Trouble with these steps? Read our troubleshooting guide. More detailed build guidance is available below.
Getting Help
Chat with us
#libgit2
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:
As libgit2 is purely a consumer of the Git system, we have to adjust to changes made upstream. This has two major consequences:
Optional dependencies
While the library provides git functionality without the need for dependencies, it can make use of a few libraries to add to it:
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
libgit2
builds cleanly on most platforms without any external dependencies. Under Unix-like systems, like Linux, *BSD and Mac OS X, libgit2 expects pthreads
to be available; they should be installed by default on all systems. Under Windows, libgit2 uses the native Windows API for threading.
The libgit2
library 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 .
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.
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.
To install the library you can specify the install prefix by setting:
$ cmake .. -DCMAKE_INSTALL_PREFIX=/install/prefix
$ cmake --build . --target install
For more advanced use or questions about CMake please read https://cmake.org/Wiki/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
$ cmake ..
# List all build options and their values
$ cmake -L
CMake lets you specify a few variables to control the behavior of the compiler and linker. These flags are rarely used but can be useful for 64-bit to 32-bit cross-compilation.
CMAKE_C_FLAGS
: Set your own compiler flagsCMAKE_FIND_ROOT_PATH
: Override the search path for librariesZLIB_LIBRARY
, OPENSSL_SSL_LIBRARY
AND OPENSSL_CRYPTO_LIBRARY
: Tell CMake where to find those specific librariesLINK_WITH_STATIC_LIBRARIES
: Link only with static versions of system librariesIf you want to build a universal binary for Mac OS X, CMake sets it all up for you if you use -DCMAKE_OSX_ARCHITECTURES="i386;x86_64"
when configuring.
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.
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.
Author: libgit2
Source Code: https://github.com/libgit2/libgit2
License: View license
1604109000
Git has become ubiquitous as the preferred version control system (VCS) used by developers. Using Git adds immense value especially for engineering teams where several developers work together since it becomes critical to have a system of integrating everyone’s code reliably.
But with every powerful tool, especially one that involves collaboration with others, it is better to establish conventions to follow lest we shoot ourselves in the foot.
At DeepSource, we’ve put together some guiding principles for our own team that make working with a VCS like Git easier. Here are 5 simple rules you can follow:
Oftentimes programmers working on something get sidetracked into doing too many things when working on one particular thing — like when you are trying to fix one particular bug and you spot another one, and you can’t resist the urge to fix that as well. And another one. Soon, it snowballs and you end up with so many changes all going together in one commit.
This is problematic, and it is better to keep commits as small and focused as possible for many reasons, including:
Additionally, it helps you mentally parse changes you’ve made using git log
.
#open source #git #git basics #git tools #git best practices #git tutorials #git commit
1597916460
There is no doubt that Git plays a significant role in software development. It allows developers to work on the same code base at the same time. Still, developers struggle for code quality. Why? They fail to follow git best practices. In this post, I will explain seven core best practices of Git and a Bonus Section.
Committing something to Git means that you have changed your code and want to save these changes as a new trusted version.
Version control systems will not limit you in how you commit your code.
But is it good? Not quite.
Because you are compromising code quality, and it will take more time to review code. So overall, team productivity will be reduced. The best practice is to make an atomic commit.
When you do an atomic commit, you’re committing only one change. It might be across multiple files, but it’s one single change.
Many developers make some changes, then commit, then push. And I have seen many repositories with unwanted files like dll, pdf, etc.
You can ask two questions to yourself, before check-in your code into the repository
You can simply use the .gitignore file to avoid unwanted files in the repository. If you are working on more then one repo, it’s easy to use a global .gitignore file (without adding or pushing). And .gitignore file adds clarity and helps you to keep your code clean. What you can commit, and it will automatically ignore the unwanted files like autogenerated files like .dll and .class, etc.
#git basics #git command #git ignore #git best practices #git tutorial for beginners #git tutorials
1601157360
Hello all, nowadays most of the development teams using GIT version control, some of you may have a requirement of mirroring your team’s git changes from one server to another Git server. This article will help you to achieve the Git mirroring between one server to another server.
I got one assignment wherein there will be 2 Git Servers, development will happen in one Git server and the changes should be synchronized to another Git server at regular intervals. But in my case, the complexity is both the servers are in different restricted network. So I have done the small experiment and it worked. And I am sharing the steps to you all in this article.
Main GIT Server: Let’s take our main git server is located in our office and can be accessed only in-office network.
**Mirror GIT Server: **The mirror server is located at the vendor/client-side, which can be accessible in a normal internet connection but not with our office network. Since the office proxy will block the outside URL’s.
#devops #git #git and github #git best practices #git cloning #git server
1617875220
In this short article, we’ll be exploring some quick git commands that can help us in digging through our repositories’ history of commits. We’ll look at
#git #git-log #git-commands #git-history #aws