2017-04-11 9 views
0

複製されたリポジトリを特定のバージョンに切り替える必要があります。私はこのコードを実行すると、私が望むように動作しません。それは、私がマスターの後ろまたは上にどれくらいのコミットがあるかを認識しますが、実際にプロジェクトを切り替えるわけではありません。指定されたバージョンに切り替える方法

たとえば、あるtxtドキュメントを含むバージョン1.0と、このtxtドキュメントのないバージョン1.1があるとします。マスターがバージョン1.1を指しています

まず、リポジトリ全体をクローンします(コピー先のフォルダにはtxtドキュメントが含まれていません)。

次に、このコードを実行して、宛先フォルダにtxtドキュメントを表示します。

私はこれ試してみてください。

Download a specific tag with Git

その作業をし、私は私のコードは、同じことをやりたい、

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

(私はまた、このような何かを試してみましたが、これはgit_annotated_commit_from_refで失敗)

私の2番目の実装があります:

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

答えて

0

は私がGIT_CHECKOUT_FORCEへ

セットのチェックアウト戦略は

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(); 
を必要としてそれを得ました
関連する問題