2013-04-15 39 views
3

我想获得足够的信息来创建一个使用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); 

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

  • 我刚刚得到提交的主要主分支,如果我迭代co de改变每个分支名称的revparse_single然后我得到所有提交,但有些显然是重复提交是在多个分支
  • 我只是得到提交味精,作者和时间,所以我如何找出什么分支名称是?
  • 我在做对吧?

回答

2

使用单步行,并推动任何你想使用的提示,你可以使用push_glob推动所有分支,如果你喜欢。

如果你想建立一个图表,那么你需要看看提交的父母是什么,并使用这些信息构建你的图表。

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