How to switch to specified version

有些话、适合烂在心里 提交于 2020-01-07 02:55:09

问题


I want to switch my cloned repository to some specified version. When I run this code, its not working as I want. It realizes how many commits am I behind or above master, but it doesn't really switch the project.

For example, if I have version 1.0 with some txt document included, and version 1.1 without this txt document. Master is pointing to version 1.1

First I clone the whole repository, (destination folder doesn't contain txt document).

Then I perform this code and I want the txt document to appear in the destination folder.

When I try this:

Download a specific tag with Git

Its working and I want my code to do the same,

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

I tried also something like this, but this fails at git_annotated_commit_from_ref()

There is my second implementation :

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

回答1:


I got it

set checkout strategy to GIT_CHECKOUT_FORCE was needed

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



回答2:


void checkout_progress(
        const char *path,
        size_t cur,
        size_t tot,
        void *payload)
{
    printf("Checking out: %s    %d/%d \n",
        path, (int)cur, (int)tot);
}

std::string path = "/some/repo/dir";
std::string sha = "a9e1e91f";
git_repository *repo = NULL;

err = git_repository_open(&repo, path.c_str());

git_checkout_options checkout_opts = GIT_CHECKOUT_OPTIONS_INIT;
checkout_opts.checkout_strategy = GIT_CHECKOUT_FORCE ;
checkout_opts.progress_cb = checkout_progress;
git_object * treeish = NULL;

auto git_path = std::string("refs/heads/master/").append(sha);

err = git_revparse_single(&treeish, repo,sha.c_str());

err = git_repository_set_head(repo, git_path.c_str());

err = git_checkout_tree(repo, treeish, &checkout_opts);

git_object_free(treeish);
git_repository_free(repo);


来源:https://stackoverflow.com/questions/43342676/how-to-switch-to-specified-version

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!