c - 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);
我有树枝
- 主(当前):f1.txt f2.txt
- 新:f1.txt(内容与主人的不同)
在 GIT_CHECKOUT_SAFE 到新的之后:
- f1.txt(来自主人的内容)
- f2.txt(分阶段提交)
解决方案
我认为问题在于您尝试检查 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 指针。
推荐阅读
- iccube - iccube REST API 文档在哪里?
- c# - 无法在 C# 中使用 WebDriverWait 显式等待汉堡菜单
- java - 如何比较Java中日期的时间部分
- primefaces - 如何将依赖于 PF 的下拉列表转换为自动完成?
- javascript - Angular Material sidenav 指令在 app.component 中不起作用
- c# - 创建泛型类以更新多个类的属性
- javascript - 在 Swiper JS 中放大鼠标悬停
- javascript - Highchart - 活动量表显示标签和标签
- python - 如何使用新数据添加更新表
- c# - 采用window 8/10技术的全实时屏幕捕捉,无延迟