How to encode "git commit" in libgit2?

I searched Google and Stackoverflow for an answer to a question on how to code the equivalent of git commit -a -m "message" in libgit2 ( https://libgit2.github.com ) and C or C ++. But I can’t find a ready and working answer to this question. I am using libgit2-0.21.

Below is the code that initializes the git repository, adds two files to it, and splits the two files so that they are ready to commit.

My question is how to code "git commit -a -m" msg "in libgit2?

#include <sys/stat.h>
#include <string>
#include <fstream>
#include <iostream>
#include <git2.h>
using namespace std;


int main (int argc, char** argv)
{
  git_threads_init ();

  // Create repository directory.
  string directory = "repository";
  mkdir (directory.c_str(), 0777);

  // Initialize the repository: git init.
  git_repository *repo = NULL;
  int result = git_repository_init (&repo, directory.c_str(), false);
  if (result != 0) cerr << giterr_last ()->message << endl;

  // Store two files in the repository directory.
  ofstream file;
  file.open ("repository/file1", ios::binary | ios::trunc);
  file << "Contents of file one";
  file.close ();

  file.open ("repository/file2", ios::binary | ios::trunc);
  file << "Contents of file two";
  file.close ();

  // Run the equivalent of "git add ."

  // Get the git index.
  git_index * index = NULL;
  result = git_repository_index (&index, repo);
  if (result != 0) cerr << giterr_last ()->message << endl;

  // Add all files to the git index.
  result = git_index_add_all (index, NULL, 0, NULL, NULL);
  if (result != 0) cerr << giterr_last ()->message << endl;

  // Write the index to disk.
  result = git_index_write (index);
  if (result != 0) cerr << giterr_last ()->message << endl;

  // Run the equivalent of "git commit -a -m "commit message".

  // How to do that through libgit2?


  // Run "git status" to see the result.
  system ("cd repository; git status");

  // Free resources.
  git_index_free (index);
  git_repository_free (repo);
  git_threads_shutdown ();

  return 0;
}

The code can be compiled as follows:

g++ -Wall -I/opt/local/include -L/opt/local/lib -lgit2 -o test git.cpp

The following is the result of running the compiled binary:

On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   file1
    new file:   file2
+4
source share
1 answer

  • git_index_write_tree()
  • , git_commit_create_v()

. test,

 $ echo "test" > test.txt
 $ git add .
 $ git commit -m "Initial commit"
+5

All Articles