Вопрос:

Как перейти на указанную версию

c++ libgit2

96 просмотра

1 ответ

69 Репутация автора

Я хочу переключить свой клонированный репозиторий на указанную версию. Когда я запускаю этот код, он не работает, как я хочу. Он понимает, сколько коммитов я позади или выше мастера, но на самом деле это не меняет проект.

Например, если у меня версия 1.0 с каким-нибудь документом в формате txt и версия 1.1 без этого документа в формате txt. Мастер указывает на версию 1.1

Сначала я клонирую весь репозиторий (папка назначения не содержит текстовый документ).

Затем я выполняю этот код и хочу, чтобы текстовый документ появился в папке назначения.

Когда я пытаюсь это:

Загрузите определенный тег с помощью 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 ()

Вот моя вторая реализация:

    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();
Автор: Martin.M Источник Размещён: 11.04.2017 09:58

Ответы (1)


0 плюса

69 Репутация автора

я понял

установить стратегию оформления заказа на 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();
Автор: Martin.M Размещён: 11.04.2017 02:32
Вопросы из категории :
32x32