如何在 libgit2 中设置结帐选项以使其表现得像 "git checkout"
how to set checkout options in libgit2 to behave like "git checkout"
我在某个分行工作,但现在我想结账到另一个指定的分行。当我像这样设置结帐选项时
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();
我在某个分行工作,但现在我想结账到另一个指定的分行。当我像这样设置结帐选项时
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();