2017-04-24 81 views
0

我在一些分行的工作,但現在我想結帳到另一個指定的分支。當我設置結賬選項,如執行該如何設置結帳選項libgit2表現得像個「混帳結賬」

git_checkout_options opts = GIT_CHECKOUT_OPTIONS_INIT; 
opts.checkout_strategy = GIT_CHECKOUT_FORCE; 

結算和我的庫中的所有文件被更改到checkouted分支文件...

如果我已提交執行的第一個分支,一切都清楚了,但如果我不這樣做,我就會失去所有我無法改變的變化。

有沒有一種辦法,這會像在終端「混帳結賬」? 我的意思是,當我進行結賬,程序如果有一些未提交的更改實現,

- >如果沒有 - 結帳發生

- >如果有一些未提交的更改,它打印像一些信息Git的 終端

例如消息從終端:

您對以下文件的局部變化會被檢出覆蓋: output.csv


我想我必須設置不同的結帳策略,但我不知道哪些是最好的

我也試過

opts.checkout_strategy = GIT_CHECKOUT_NOTIFY_DIRTY; 

,但它的表現一樣力

回答

0

最後,我得到的信息的另一種方式,還有我的解決方案:

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

你可能想策略設置爲GIT_CHECKOUT_SAFE。然後,您可以將notify_flags(而不是checkout_strategy)設置爲GIT_CHECKOUT_NOTIFY_CONFLICT,並設置打印出衝突文件的通知回調。

+0

我試過了,但如果我設置結算策略,以GIT_CHECKOUT_SAFE - > checkouting後,更改僅在git倉庫製成,但文件保持不變,如果有任何uncommited更改 –

+0

順便說一句,如何打印confilcting文件?我試過cout << opts.notify_cb << endl;還有cout << git_checkout_notify_cb(opts.notify_cb)<< endl;但它打印相同:00000000 - >如果有未提交的更改,並將其打印,這也同樣如果沒有 –

+0

如果我使用的cout << git_checkout_notify_cb(opts.notify_flags)<< ENDL;它打印00000001,也總是這樣,不管是否有變更或不變 –