我发现使用libgit2从单个文件中获取差异的唯一方法是通过git_diff_foreach并在diff_file_cb回调中检查文件名.
这不是我想要的方式,我正在寻找更简单的方法。
还有其他方法可以做到这一点吗?
最佳答案
为了澄清,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
并且仅使用精确的文件名匹配。
关于c - git diff 仅一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20107920/