Ich möchte Repository-Protokolle einschließlich Tags gehen. Bisher kann ich alle SHA für alle Commits inklusive Tags mit Revwalk ausdrucken. Allerdings will jedes Mal, wenn ich die Tag-Informationen ziehen, die begehen mit oid ich Fehler bekommenGet Annotated Tags von Revwalk commit
„Der angeforderte Typ nicht die Art in ODB überein“
ich, dass der Tag SHA gemeldet sehen von Revwalk enthält die SHA gemeldet von git show-ref --tags
Also ich weiß nicht, warum Tag-Lookup nicht funktioniert.
Hier ist der vereinfachte Code, die ich benutze:
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
Wenn ich bezwecken git_tag ich das Ziel verpflichten bekommen. Jetzt habe ich das Ziel-Commit, also wie bekomme ich die Tags unter diesem Commit? Etwas ähnliches wie git tag --points-at commit_SHA
UPDATE
Nach Carlos' Antwort hier ist mein neuer Code. Die Herausforderung besteht nun darin, wie ich den git_tag * bekomme. Wie man sehen kann ich git_reference * (benannt ref), aber ich weiß nicht, wie es zu konvertieren * git_tag
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);
}
Vielen Dank für detaillierte Antwort. Jetzt kann ich sehen. Können Sie jedoch erklären, was Peel genau macht? Ich habe versucht, es von Docs zu verstehen (in all diesen Tagen habe ich dieses Problem bekämpft), aber ich konnte es nicht in mein Gehirn bekommen. Nochmals vielen Dank! –
Ich habe versucht, die ausgezeichnete Erklärung zu verstehen, aber bisher konnte ich das nicht. Können Sie ein einfaches, ungetestetes Beispiel schreiben, um Ihre Punkte zu verdeutlichen? Ich kann sie nicht kombinieren, um zu bekommen, was ich will. –
Ich habe versucht, Ihre Kommentare jetzt anzuwenden Ich habe neuen Code und Herausforderung, siehe aktualisierten Beitrag. Vielen Dank –