只有一个文件的git diff

时间:2013-11-20 21:58:37

标签: c libgit2

我发现使用 libgit2 从单个文件中获取差异的唯一方法是通过 git_diff_foreach 并检查 diff_file_cb 回调中的文件名

这不是我想要的方式,我正在寻找更容易的东西。

还有其他办法吗?

2 个答案:

答案 0 :(得分:4)

只是为了澄清,git_diff_index_to_workdir(或git_diff_tree_to_tree或其他此类函数)找到已更改文件的列表,然后git_diff_foreach遍历找到的文件和差异文本。您可以在git_diff_index_to_workdir的选项结构中传递“pathspec”,这将限制要检查的文件。你会像前面的回答中提到的那样做。

作为一个稍微宽泛的例子,如果你想区分一组更复杂的文件,你可以编写如下内容:

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并且仅使用精确的文件名匹配。

答案 1 :(得分:0)

使用 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);