使用libgit2结帐分支

时间:2017-10-15 17:35:43

标签: c git git-checkout libgit2

我试图在两个分支之间实施简单的结账操作。代码执行没有错误。

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相当于干跑;没有文件将被签出。

     

SAFEgit checkout类似;更新未修改的文件,并保留修改后的文件。如果旧HEAD中存在文件   但是丢失了,它被认为已删除,并且不会被创建。

     

RECREATE_MISSING类似于git checkout-index,或者克隆后会发生什么。更新未修改的文件,丢失文件   已创建,但具有修改的文件将保持不变。

     

FORCEgit checkout --force类似;将覆盖所有修改,并创建所有丢失的文件。

在我的情况下,我使用非常小的回购测试它,没有未经修改的更改,并且这两个分支之间没有任何冲突。

git log

我做错了什么?我希望此代码可以执行git checkout master

之类的操作

1 个答案:

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