如何在 libgit2 中设置结帐选项以使其表现得像"git checkout"

how to set checkout options in libgit2 to behave like "git checkout"

本文关键字:checkout git libgit2 设置 选项      更新时间:2023-10-16

我在某个分支中工作,但是现在我想结帐到另一个指定的分支。当我设置这样的结帐选项

git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
opts.checkout_strategy = GIT_CHECKOUT_FORCE;

进行了结帐,并且我在存储库中的所有文件都更改为结帐分支中的文件...

如果我在第一个分支机构中执行了提交,那么一切都很清楚,但是如果我不这样做,我就会丢失所有不承诺的更改。

是否有一种方法可以像终端中的" Git Checkout"一样行事?我的意思是,当我进行结帐时,程序会意识到是否有一些不承认的更改,

->如果没有 - 结帐正在发生

->如果有一些不承认的更改,它会打印一些信息,例如git 终端

例如,来自终端的消息:

您对以下文件的本地更改将被结帐覆盖:output.csv


我认为我必须设定不同的结帐策略,但是我不知道哪个是最好的

我也尝试了

opts.checkout_strategy = GIT_CHECKOUT_NOTIFY_DIRTY;

,但其行为与力相同

您可能想将策略设置为GIT_CHECKOUT_SAFE。然后,您可以将notify_flags(不是checkout_strategy(设置为GIT_CHECKOUT_NOTIFY_CONFLICT,并设置打印出冲突文件的通知回调。

最后,我以另一种方式获得了信息,有我的解决方案:

git_libgit2_init();
const char * REPO_PATH = path.c_str();
git_repository * repo = nullptr;
git_repository_open(&repo, REPO_PATH);
git_diff_options diffopts = GIT_DIFF_OPTIONS_INIT;
git_diff *diff;
diffopts.flags = GIT_CHECKOUT_NOTIFY_CONFLICT;
git_diff_index_to_workdir(&diff, repo, NULL, &diffopts);
size_t num_deltas = git_diff_num_deltas(diff);
if (num_deltas != 0){
    const git_diff_delta *delta = git_diff_get_delta(diff, 0);
    int i = 0;
    cerr << "Your local changes to the following files would be overwritten by checkout : " << endl;
    while (i<num_deltas) {
        delta = git_diff_get_delta(diff, i);
        git_diff_file file = delta->new_file;
        cerr << "t" << file.path << endl;
        i++;
    }
    cerr << "Please commit your changes before you switch branches. " << endl;
}
else cout << "All files OK, can checkout now" << endl;
git_diff_free(diff);
git_repository_free(repo);
git_libgit2_shutdown();