我正在尝试使用旧版本的 libgit2(没有 checkout.h)来实现类似结帐的功能。
首先,我在分支 A 上,它看起来像:
Branch:
A A0 --- A1
/
Master M
每次提交都会创建一个同名文件,例如,标记为 A1 的提交会创建一个文件 A1。如果我此时查看 gitk,一切看起来都与我想要的完全一样。
现在我创建了一个新分支,B
我想向它添加一个提交:
Branch:
A A0 --- A1
/
Master M
\
B B0
但是,当我使用我的代码“结帐”B 时,它会使 A0 和 A1 未被跟踪,而不是像我期望的那样删除它们:
(B)$ git status
# On branch B
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# A0
# A1
nothing added to commit but untracked files present (use "git add" to track)
所以,我认为我的结帐代码缺少一些东西,那就是:
void Checkout(const char *branch_name, git_commit *branch_tip) {
// Update index & tree
git_tree *tree;
git_commit_tree(&tree, branch_tip);
git_index_read_tree(index_, tree);
git_index_write(index_);
git_tree_free(tree);
// Reset head
string branch_ref = string("refs/heads/") + branch_name;
git_reference *head;
git_reference_lookup(&head, repo_, kGitHeadFile);
git_reference_set_target(head, branch_ref.c_str());
git_reference_free(head);
}
(请注意,我实际上是在检查真实代码中的每一行的返回代码,并且所有内容都返回 0,只是不想在这里把事情弄得乱七八糟。)
据我所知,这段代码符合 git 文档描述的内容git checkout <branch>
:
To prepare for working on <branch>, switch to it by updating
the index and the files in the working tree, and by pointing
HEAD at the branch.
是否有一些...“更新工作树”命令我需要运行?