我發現使用libgit2一個單一的文件得到一個差異的唯一方式的git的差異是通過git_diff_foreach和檢查在diff_file_cb回調的文件名。只有一個文件
這不是我想要這樣做的方式,我一直在尋找更容易的東西。
是否有另一種方法可以做到這一點?
我發現使用libgit2一個單一的文件得到一個差異的唯一方式的git的差異是通過git_diff_foreach和檢查在diff_file_cb回調的文件名。只有一個文件
這不是我想要這樣做的方式,我一直在尋找更容易的東西。
是否有另一種方法可以做到這一點?
使用pathspec選項和git_diff_index_to_workdit代替git_diff_foreach
char *pathspec = "foo.bar";
git_diff_options opts = GIT_DIFF_OPTIONS_INIT;
opts.pathspec.strings = &pathspec;
opts.pathspec.count = 1;
git_diff_index_to_workdir(&diff, repo, NULL, &opts);
只是爲了澄清,git_diff_index_to_workdir
(或git_diff_tree_to_tree
或另一個這樣的功能)要容易得多認定的修改過的文件列表,然後git_diff_foreach
遍歷找到的文件和差異文本。您可以在git_diff_index_to_workdir
的選項結構中傳遞「pathspec」,這將限制正在檢查的文件。你會這樣做,如前面的答案所述。
作爲稍寬例如,如果你想diff的一組更復雜的文件,你可以寫這樣的:
git_diff *diff;
git_diff_options opts = GIT_DIFF_OPTIONS_INIT;
char *files[3];
files[0] = "myfile.txt";
files[1] = "yourfile.txt";
files[2] = "some/directory/*.h"
opts.pathspec.count = 3;
opts.pathspec.strings = files;
if (git_diff_index_to_workdir(&diff, repo, NULL, &opts) < 0) {
printf("Failed to diff\n");
exit(1);
}
git_diff_foreach(diff, file_cb, NULL, NULL, NULL);
git_diff_free(diff);
只要你喜歡你可以傳遞儘可能多的文件名或文件模式。如果要禁用模式匹配行爲(即擴展*
等),則可以編寫opts.flags |= GIT_DIFF_DISABLE_PATHSPEC_MATCH
,並且只會使用精確的文件名匹配。
[看看這個答案](http://stackoverflow.com/questions/16563021/how-to-get-the-diff-of-a-single-file-with-libgit2) –
是的,我有。我認爲解決這個問題的方法是使用git_diff_index_to_workdir()和pathspec選項 – AndreDurao