2017-10-15 109 views
1

我正試圖在兩個分支之間實現一個簡單的結帳操作。代碼執行沒有錯誤。使用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相當於空轉;沒有文件將被檢出。

SAFE類似於git checkout;未修改的文件被更新,修改後的文件被單獨保留。如果舊HEAD 中存在文件但缺失,則認爲它已被刪除,並且不會被創建。

RECREATE_MISSINGgit checkout-index類似,或克隆後發生了什麼。未修改的文件被更新,創建了丟失的文件 ,但修改後的文件被單獨保留。

FORCE類似於git checkout --force;所有的修改都被覆蓋,並且所有丟失的文件都被創建。

在我的情況下,我測試它與一個非常小的回購沒有無可爭議的變化和這兩個分支之間沒有任何衝突。

git log

我在做什麼錯?我預計此代碼可以執行類似於git checkout master

回答

2

git checkout命令異常重載。它涉及將文件放入磁盤(檢出)切換分支。特別是,git checkout <branch>將更新工作目錄以匹配給定分支的內容並切換到

libgit2 API不會混淆這兩個操作。 git_checkout_*函數只會檢查磁盤上的文件。

文件應當明確這一點:

在libgit2,結賬用於更新工作目錄和索引 以匹配目標樹。與git checkout不同,它不會移動HEAD 爲您提供 - 使用git_repository_set_head或類似的來做到這一點。

所以你寫的(上面)將更新工作目錄以匹配分支的內容。之後,您需要將您的分支更新到您想要切換到的分支。

您可以使用git_repository_set_head來更新HEAD指向給定的分支,一旦文件已經簽出。確保指定完全合格的分支名稱(例如,refs/heads/master)。

git_object *treeish = NULL; 
git_checkout_options opts; 
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(); 
+0

謝謝!它現在按預期工作!我也將這個問題的答案(https://stackoverflow.com/a/30469509/4942153)添加到以避免「git_checkout_options上的無效版本0」錯誤 –