2013-04-15 60 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選項所做的,你只需要記住每個分支提示所指向的內容,然後在你打印出這些信息時在它旁邊繪製它。