我正在尝试使用LibGit2,而且我陷入了提交。我试过this one只适用于“初始”提交。对于下一次提交,它失败了-15“当前提示不是第一个父级”。
两个问题:
THX。
答案 0 :(得分:8)
我如何知道我是否需要初始提交?
您可以查看git_repository_head_unborn()以查看HEAD是否指向参考。
如何执行非初始提交?
您需要提供要提交的索引。使用git_repository_index()最简单。但是,索引必须以树的形式提供。容易引起混淆的git_index_write_tree()会将索引写入树中。
要获取父项,请使用git_oid_fromstr()从哈希或git_reference_name_to_id()获取对象ID,以便从引用名称(例如“HEAD”)获取它。然后使用git_commit_lookup()从oids中获取提交对象。
然后将它们传递到git_commit_create()或git_commit_create_v()。使用git_commit_create_v()可以避免必须列出git_commit指针,只需像printf()
这样的参数传递提交。
有一个good example in ex/general.c可以更好地解释所有步骤。我也喜欢使用围绕libgit2的Perl包装器Git :: Raw作为示例。看the .xs files(基本上是C)。
这是一个未经测试的将索引提交给HEAD的示例。我假设你已经有作者,提交者和回购。
git_oid tree_id, parent_id, commit_id;
git_tree *tree;
git_commit *parent;
git_index *index;
/* Get the index and write it to a tree */
git_repository_index(&index, repo);
git_index_write_tree(tree, index);
/* Get HEAD as a commit object to use as the parent of the commit */
git_reference_name_to_id(parent_id, repo, "HEAD");
git_commit_lookup(&parent, repo, parent_id);
/* Do the commit */
git_commit_create_v(
commit_id,
repo,
"HEAD", /* The commit will update the position of HEAD */
author,
committer,
NULL, /* UTF-8 encoding */
message,
tree, /* The tree from the index */
1, /* Only one parent */
parent /* No need to make a list with create_v */
);