2016-04-10 8 views
1

タグを含むリポジトリログを通過したい。これまでのところ、私はrevwalkでタグを含むすべてのコミットに対してすべてのSHAを出力できます。しかし、私はOIDコミット使用してタグ情報を引き出したいたびに私は、タグSHAが報告されたことがわかりますrevwalkコミットから注釈付きタグを取得

「を要求されたタイプは、ODBタイプと一致していません」というエラー

を取得しますrevwalkには、git show-ref --tagsによって報告されたSHAが含まれているので、なぜタグの参照が機能しないのかわかりません。

は、ここで私が使用して単純化されたコードです:

int error = 0; 
git_oid oid; 

git_revwalk *walk; 
error = git_revwalk_new(&walk, m_repo); 

git_revwalk_sorting(walk, 
        GIT_SORT_TOPOLOGICAL | 
        GIT_SORT_TIME); 

git_revwalk_push_head(walk); 
//git_revwalk_hide_glob(walk, "tags/*"); -- I want to see tags so I commented this one 

while(git_revwalk_next(&oid, walk) == 0) 
{ 
    git_commit *commit; 
    char oidstr[10] = {0}; 

    if(git_commit_lookup(&commit, m_repo, &oid)==0) 
    { 

     git_tag *tag = NULL; 
     int error = git_tag_lookup(&tag, m_repo, &oid); 
     if(error==0) 
     { 
      wxString tname(git_tag_name(tag)); 
      data.push_back("["+tname+"] "+cltStr); 
     } 
     else 
     { 
      //It always land here with error no -3 and message: The requested type does not match the type in ODB 
     } 

     git_tag_free(tag); 

     const git_signature *author = git_commit_author(commit); 
    } 
    git_commit_free(commit); 
} 
git_revwalk_free(walk); 

TL; DR

私はターゲットがコミット私が得ることができるオブジェクトをgit_tagいる

。今私は目標をコミットしているので、どのように私はそのコミットの下にタグを取得するのですか?カルロスと答えた後git tag --points-at commit_SHA

UPDATE

に似た何かがここに私の新しいコードです。ここでの課題は、どのようにgit_tag *を取得するかです。あなたが見ることができるように私はgit_reference※(名前の参照を)持っているが、私は

git_reference_iterator *iter = NULL; 
git_reference *ref = NULL; 

git_reference_iterator_glob_new(&iter, m_repo, "refs/tags/*"); 

while(git_reference_next(&ref, iter) == 0) 
{ 
    git_object *target = NULL; 
    git_object *obj; 

    const git_oid *targetId = git_reference_target(ref); 
    git_object_lookup(&obj, m_repo, targetId, GIT_OBJ_ANY); 

    git_object_peel(&target, obj, GIT_OBJ_COMMIT); 

    if(git_oid_equal(git_commit_id(commit), git_commit_id((git_commit*)target))==1) 
    { 
     //tag found 
     //how do I get a git_tag* here? 
    } 
    git_object_free(obj); 
    git_reference_free(ref); 
    git_object_free(target); 
} 

答えて

1

注釈付きタグは、オブジェクトグラフのルートとして存在する独自のオブジェクトです*それはgit_tagに変換する方法を知りません。 I.彼らはオブジェクトを指していますが、何もそれらを指していません[0]。逆マッピングを理解したい場合は、自分でリストを保持する必要があります。これは、git tag --points-atの逆マッピングが行うことです:タグのリストとそれらが指しているものを取り出し、興味のあるIDのリストを探します。

libgit2を使用すると、参照イテレータは(refs/tags/の下に何もかけgit_reference_iterator_glob_new(&iter, repo, "refs/tags/*"))を見て、参照のターゲット(git_reference_target()を)取る、コミット(またはあなたが興味を持っている他のオブジェクトのタイプを取得するgit_object_peel()を使用)して、あなたがしているものと、そのオブジェクトのIDを比較します

他のすべてのオブジェクト検索機能と同様に、git_tag_lookupは、質問の注釈付きタグを参照します(git_tagオブジェクト)。コミットのIDを渡すと、コミットがロードされ、型が一致せず、このエラーが発生することがわかります。

タグが他のタグをポイントすることができますが、[0]、それは

UPDATE

この場合には関係ありません何更新されたコードが必要なのはあなたが前にやっていたものを行うことです。 git_tag_lookup()を使用してgit_tagオブジェクトをルックアップし、ルックアップするIDとして参照ターゲットを渡します。しかし、すべてのタグ参照がタグオブジェクトを指すわけではないことを認識しています。多くのプロジェクトでは、タグはコミットを直接指しています。

再度git_object_peel()を使用して、注釈付きタグがない場合はエラーを返すタグ(GIT_OBJ_TAG)を取得できます。

git tag --points-atを複製しようとしている場合は、チェーンに注釈付きタグがあるかどうかは気にしないことにも注意してください。特定のタグ参照をコミットに解決できれば、その結果を返します。

+0

詳細な回答をいただきありがとうございます。今私は見ることができます。しかし、ピールが何をするのか説明できますか?私はドキュメントから理解しようとしましたが(私はこの問題を戦っていた頃でしたが)、私はそれを私の脳に取り込めませんでした。再びありがとう! –

+0

私は優れた説明を理解しようとしましたが、今まで私はできませんでした。あなたのポイントを説明するためだけに簡単な例を書けますか?私はそれらを組み合わせて私が望むものを得ることはできません。 –

+0

私は今あなたのコメントを適用しようとしました。新しいコードとチャレンジがあります。更新された投稿をご覧ください。ありがとう –

関連する問題