我试图在两个分支之间实施简单的结账操作。代码执行没有错误。
git_libgit2_init();
git_object *treeish = NULL;
git_checkout_options opts;
opts.checkout_strategy = GIT_CHECKOUT_SAFE;
/* branchName in this case is "master" */
handleError(git_revparse_single(&treeish, repo, branchName));
handleError(git_checkout_tree(repo, treeish, &opts));
git_object_free(treeish);
git_libgit2_shutdown();
但是,当我使用git status
检查分支时,分支不会更改。
我已经检查了101 examples of libgit2,并说:
git_checkout_options
实际上不是非常可选的。默认值不会 在少数情况下有用。最好的例子 是checkout_strategy;默认值对工作树不执行任何操作。 因此,如果您希望结帐检出文件,请选择合适的文件 策略。
NONE
相当于干跑;没有文件将被签出。
SAFE
与git checkout
类似;更新未修改的文件,并保留修改后的文件。如果旧HEAD中存在文件 但是丢失了,它被认为已删除,并且不会被创建。
RECREATE_MISSING
类似于git checkout-index
,或者克隆后会发生什么。更新未修改的文件,丢失文件 已创建,但具有修改的文件将保持不变。
FORCE
与git checkout --force
类似;将覆盖所有修改,并创建所有丢失的文件。
在我的情况下,我使用非常小的回购测试它,没有未经修改的更改,并且这两个分支之间没有任何冲突。
我做错了什么?我希望此代码可以执行git checkout master
答案 0 :(得分:6)
git checkout
命令异常重载。它处理将文件放在磁盘上(签出)和切换分支。特别是,git checkout <branch>
将更新工作目录以匹配给定分支的内容并切换到它。
libgit2 API不会混淆这两个操作。 git_checkout_*
函数只会检查磁盘上的文件。
文档应该澄清这一点:
在libgit2中,checkout用于更新工作目录和索引 匹配目标树。与git checkout不同,它不会移动HEAD 为你提交 - 使用
git_repository_set_head
等来做到这一点。
所以你写的(上面)将更新工作目录以匹配分支的内容。之后,您需要将分支更新为要切换到的分支。
您可以使用git_repository_set_head
执行此操作,以便在检出文件后更新HEAD
以指向给定的分支。请务必指定完全限定的分支名称(例如,refs/heads/master
)。
git_object *treeish = NULL;
git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
opts.checkout_strategy = GIT_CHECKOUT_SAFE;
git_libgit2_init();
handleError(git_revparse_single(&treeish, repo, "master"));
handleError(git_checkout_tree(repo, treeish, &opts));
handleError(git_repository_set_head(g_repo, "refs/heads/master"));
git_object_free(treeish);
git_libgit2_shutdown();