简体   繁体   中英

how to set checkout options in libgit2 to behave like “git checkout”

I am working in some branch, but now I want to checkout to another specified branch. When I set checkout options like this

git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT;
opts.checkout_strategy = GIT_CHECKOUT_FORCE;

checkout is performed and all my files in repository are changed to files in checkouted branch...

If I have performed commit in the first branch, everything is clear, but if I don't, I lost all of my uncommited changes.

Is there a way that this will behave like "git checkout" in terminal? I mean that when I perform checkout, program realizes if there are some uncommited changes,

->if there are not - checkout is happening

->if there are some uncommited changes, it prints some information like git terminal

for example message from terminal :

Your local changes to the following files would be overwritten by checkout: output.csv


I think I have to set different checkout strategy, but I have no idea about which would be the best

I tried also

opts.checkout_strategy = GIT_CHECKOUT_NOTIFY_DIRTY;

but it behave the same as force

You probably want to set the strategy to GIT_CHECKOUT_SAFE . Then you can set notify_flags (not checkout_strategy ) to GIT_CHECKOUT_NOTIFY_CONFLICT and set a notify callback that prints out the conflicting files.

Finally, I got the information another way, there is my solution :

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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM