Ich möchte mein geklontes Repository auf eine bestimmte Version umstellen. Wenn ich diesen Code ausführe, funktioniert es nicht so, wie ich es möchte. Es erkennt, wie viele Commits ich hinter oder über Master bin, aber es ändert nicht wirklich das Projekt.So wechseln Sie zur angegebenen Version
Zum Beispiel, wenn ich Version 1.0 mit einigen TXT-Dokument enthalten, und Version 1.1 ohne dieses TXT-Dokument. Master zeigt auf Version 1.1
Zuerst klonen ich das gesamte Repository, (Zielordner enthält kein TXT-Dokument).
Dann führe ich diesen Code und ich möchte das TXT-Dokument im Zielordner angezeigt werden.
Wenn ich versuche dies:
Download a specific tag with Git
Sein Arbeits- und ich meinen Code wollen das Gleiche tun,
git_libgit2_init();
const char * REPO_PATH = path.c_str();
git_repository * repo = nullptr;
git_repository_open(&repo, REPO_PATH);
git_reference *ref;
git_reference_lookup(&ref, repo, "refs/heads/master"); // "refs/remotes/origin/HEAD"
git_reference *new_ref;
git_reference_lookup(&new_ref, repo, tag.c_str());
git_revwalk *walker;
git_revwalk_new(&walker, repo);
git_revwalk_push_ref(walker, tag.c_str());
git_oid id;
git_revwalk_next(&id, walker);
git_reference_set_target(&new_ref, ref, &id, NULL);
if (0 != git_repository_set_head_detached(repo, &id)) cerr << "problem occured while detaching head" << endl;
git_revwalk_free(walker);
git_repository_free(repo);
git_libgit2_shutdown();
Ich habe auch versucht, so etwas, aber das scheitert an git_annotated_commit_from_ref ()
Es gibt meine zweite Implementierung:
git_libgit2_init();
const char * REPO_PATH = path.c_str();
git_repository * repo = nullptr;
git_repository_open(&repo, REPO_PATH);
git_reference *ref;
git_reference_lookup(&ref, repo, tag.c_str());
git_annotated_commit *out;
if (0 != git_annotated_commit_from_ref(&out,repo,ref)) cerr << "error creating annotated commit" << endl;
if (0 != git_repository_set_head_detached_from_annotated(repo, out)) cerr << "problem occured while detaching head" << endl;
git_repository_free(repo);
git_libgit2_shutdown();