我試圖用舊版本libgit2(無checkout.h)實施結賬一樣的功能。如何在使用libgit2簽出分支時更新工作樹?
首先,我對分支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.
有一些...「更新工作樹」命令我需要運行?
我忘了提及該代碼也不會將CRLF過濾應用於blob數據,但如果您不在最近的libgit2上,那麼您可能不太會用正確的方式處理它。希望你在一個不需要它的平臺上。 – arrbee