首页 > 解决方案 > libgit2 git_checkout_head 和 GIT_CHECKOUT_SAFE 对工作目录不做任何事情

问题描述

我正在尝试使用 libgit2 进行分支切换。Repo 已被克隆并已创建对现有远程分支的引用。

如果我将 GIT_CHECKOUT_FORCE 放入 checkout_strategy,它会按预期工作 - 创建缺失,修改现有,删除删除。

如果 GIT_CHECKOUT_RECREATE_MISSING - 仅创建缺失。

如果 GIT_CHECKOUT_SAFE - 什么也不做。我错过了什么吗?

git_reference_lookup(&branch_ref, repo, ref_name);
git_repository_set_head(repo, git_reference_name(branch_ref));
git_reference_symbolic_create(&head, repo, "HEAD", git_reference_name(branch_ref), 1, NULL);
git_checkout_head(repo, &opts);

我有树枝

在 GIT_CHECKOUT_SAFE 到新的之后:

标签: clibgit2

解决方案


我认为问题在于您尝试检查 HEAD 时回购的状态。在您的代码运行之前,您有:

on disk  - f1: master's content, f2: master's content
in index - f1: master's content, f2: master's content
in HEAD  - f1: master's content, f2: master's content

更新 HEAD 以指向您的new分支后,您现在拥有:

on disk  - f1: master's content, f2: master's content
in index - f1: master's content, f2: master's content
in HEAD  - f1: new's content,    f2: absent

对于 git,这与您在new分支上,对 f1 进行git add更改并对索引进行这些更改是无法区分的。(换句话说,git 会将这些描述为“待提交”。)因此,当您要求它以安全模式检查 HEAD 内容时,它拒绝丢弃您的更改。

同样,对于 f2,它似乎是一个新添加的文件,因此安全模式不会将其删除。

我解决了这些问题,git_checkout_tree 首先使内容与new分支匹配(因此 libgit2 可以看到内容与 HEAD 匹配,因此可以安全地吹走),然后再更新 HEAD 指针。


推荐阅读