如何使用libgit2承诺一个Git仓库?(How to commit to a git repos

2019-08-18 07:03发布

由于没有用于创建不使用与磁盘文件的提交没有复制粘贴例如libgit2 据我可以告诉我想我应该添加一个。

不要忘记,libgit2是全面发展,在这个时候(2013年3月),所以来看看官方文档和源代码,新的功能每天都会添加:

  • libgit2 API
  • 标题是很好的注释- 这里是一个例子
  • 广泛的测试可以是灵感来源
  • 也有一些官方的例子 , general.c是一个良好的开端
  • 灵感可参见LibGit2Sharp -这里有一些测试

Answer 1:

bool addGitCommit ( 
  git_repository * repo, git_signature * sign, 
  const char * content, int content_sz,
  const char * message )
{
  int rc;              /* return code for git_ functions */
  git_oid oid_blob;    /* the SHA1 for our blob in the tree */
  git_oid oid_tree;    /* the SHA1 for our tree in the commit */
  git_oid oid_commit;  /* the SHA1 for our initial commit */
  git_blob * blob;     /* our blob in the tree */
  git_tree * tree_cmt; /* our tree in the commit */
  git_treebuilder * tree_bld;  /* tree builder */
  bool b = false;

  /* create a blob from our buffer */
  rc = git_blob_create_frombuffer( 
        &oid_blob,
        repo, 
        content, 
        content_sz );
  if ( rc == 0 ) { /* blob created */
    rc = git_blob_lookup( &blob, repo, &oid_blob );
    if ( rc == 0 ) { /* blob created and found */
      rc = git_treebuilder_create( &tree_bld, NULL );
      if ( rc == 0 ) { /* a new tree builder created */
        rc = git_treebuilder_insert( 
              NULL, 
              tree_bld, 
              "name-of-the-file.txt", 
              &oid_blob, 
              GIT_FILEMODE_BLOB );
        if ( rc == 0 ) { /* blob inserted in tree */
          rc = git_treebuilder_write( 
                &oid_tree, 
                repo, 
                tree_bld );
          if ( rc == 0 ) { /* the tree was written to the database */
            rc = git_tree_lookup(
                  &tree_cmt, repo, &oid_tree );
            if ( rc == 0 ) { /*we've got the tree pointer */  
              rc = git_commit_create(
                    &oid_commit, repo, "HEAD",
                    sign, sign, /* same author and commiter */
                    NULL, /* default UTF-8 encoding */
                    message,
                    tree_cmt, 0, NULL );
              if ( rc == 0 ) {
                b = true;
              }
              git_tree_free( tree_cmt );
            }
          }
        }
        git_treebuilder_free( tree_bld );
      }
      git_blob_free( blob );
    }
  }
  return b;
}

该库来自git_repository_init()git_repository_open() 签名来自git_signature_now()git_signature_new()

该函数更新当前分支的头部。

如果你做一个git status ,函数执行后你会发现文件name-of-the-file.txt出现被删除。 这是因为该功能不会创建一个实际的文件,只在GIT数据库的条目。

另外,还要注意的最后一个参数git_commit_create() 0和NULL表示这是第一次(根)提交。 对于所有其他应该有至少一个父提交的规定,使用也许获得git_commit_lookup()


我刚学这些东西。 如果你知道更好的请提高这个答案。



文章来源: How to commit to a git repository using libgit2?
标签: c++ c libgit2