2017-04-11 4 views
0

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(); 

Antwort

0

ich es bekam

Set Kasse Strategie GIT_CHECKOUT_FORCE benötigt wurde

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");  

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_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; 
opts.checkout_strategy = GIT_CHECKOUT_FORCE; 
if (0 != git_checkout_head(repo, &opts)) cout << "problem checkout head" << endl; 

git_revwalk_free(walker); 
git_repository_free(repo); 
git_libgit2_shutdown(); 
Verwandte Themen