如何创建历史图表

时间:2013-04-15 21:39:28

标签: libgit2 revision-history

我正在尝试使用libgit2获取足够的信息来创建历史图,但我不确定如何根据需要获取提交的分支名称等内容。

我希望重现使用以下git命令生成的内容:

git log --oneline --graph --decorate --all

这是我正在使用的代码:

git_commit* old_head = NULL;
error = git_revparse_single( (git_object**) &old_head, open_repo, "refs/heads/master" );
if( error != 0 )
{
  return SG_PLUGIN_OK;
}


const git_oid *head_oid = git_object_id( (git_object*)old_head );

git_revwalk *walk;

git_revwalk_new( &walk, open_repo );
git_revwalk_sorting( walk, GIT_SORT_TOPOLOGICAL | GIT_SORT_TIME );
git_revwalk_push( walk, head_oid );

const git_signature *cauth;
const char *cmsg;
git_time_t ctime;

git_oid newoid;
while( ( git_revwalk_next( &newoid, walk ) ) == 0 )
{
  git_commit *wcommit;
  error = git_commit_lookup( &wcommit, open_repo, &newoid );
  if( error != 0 )
  {
    return SG_PLUGIN_OK;
  }

  ctime = git_commit_time( wcommit );
  cmsg  = git_commit_message( wcommit );
  cauth = git_commit_author( wcommit );

  TRACE("\t%s (%s at %d)\n", cmsg, cauth->email, ctime );

  git_commit_free( wcommit );
}

git_revwalk_free( walk );

我可以遍历提交,但我对上面的代码有几个问题:

  • 我只是得到主要主分支的提交,如果我迭代代码更改每个分支名称的revparse_single然后我得到所有提交但有些显然是重复的,其中提交在多个分支下
  • 我只是得到提交消息,作者和时间,所以我如何找出分支名称是什么?
  • 我做得对吗?

1 个答案:

答案 0 :(得分:3)

使用一次步行并推送您想要使用的任何提示,如果您愿意,可以使用push_glob推送所有分支。

如果您想构建图表,那么您需要查看提交的父项,并使用该信息构建图表。

至于分支名称,如果你指的是git-log的--decorate选项的作用,你只需要记住每个分支尖端指向的内容,然后在你打印时在它旁边绘制它出了那些信息。