如何切换到指定版本
How to switch to specified version
我想将克隆的存储库切换到某个指定的版本。当我运行此代码时,它无法按我想要的方式工作。它意识到我落后于或高于主的提交次数,但它并没有真正切换项目。
例如,如果我有包含一些 txt 文档的 1.0 版,以及不包含此 txt 文档的 1.1 版。Master 指向 1.1 版
首先,我克隆整个存储库(目标文件夹不包含 txt 文档)。
然后我执行此代码,我希望 txt 文档出现在目标文件夹中。
当我尝试这个时:
使用 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();
我明白了
设置结帐策略以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();
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);
相关文章:
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 与互斥锁相比,旋转锁可以保证上下文切换
- 如何在运行中期切换GTK CSS style_context
- 导入库可以跨dll版本工作吗
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何在cpp文件之间切换窗口?在Qt中
- Python中的for循环与C++有何不同
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 不同的Visual Studio版本中缺少.dll
- 用符号版本替换对函数的所有调用
- 如何切换到指定版本
- 切换到更高的 Boost 版本 1.6.1 时出现编译错误
- 如何在不同的MS Office版本之间进行C 应用程序切换
- 根据成员函数的版本切换成员函数名称
- 在G++版本之间切换以支持C++11
- 如何正确地在gcc版本之间切换
- 在基于HPC的远程Linux上切换gcc版本(没有root权限)