c++ - libgit2 - 两个文本 blob 的差异

标签 c++ c git libgit2

我想用 libgit2 编写类似于“git diff blobish blobish”的程序

到目前为止,这是我的代码

git_repository* repo;
git_repository_open(&repo, path/to/repository);
git_blob *oldBlob, *newBlob;
git_oid old_oid, new_oid;
const char* oldBlobHash = "92fd12351a4e4d6f10d30516149c624e6b9e3dc9";
git_oid_fromstr(&old_oid, oldBlobHash);
git_blob_lookup(&oldBlob, repo, &old_oid);
const char* newBlobHash = "80bf2770cdbb9580bc040d49775fccd405f534dc";
git_oid_fromstr(&new_oid, newBlobHash);
git_blob_lookup(&newBlob, repo, &new_oid);

git_diff_blobs(oldBlob,
        NULL,
        newBlob,
        NULL,
        NULL,?, ?, ?, ?); //what should I put in the question marks?

.... // how do I continue from here?

当我在命令行上运行“git diff 92fd1235 80bf2770”时,我得到了

diff --git a/92fd12351a4e4d6f10d30516149c624e6b9e3dc9 b/80bf2770cdbb9580bc040d49775fccd405f534dc
index 92fd123..80bf277 100644
--- a/92fd12351a4e4d6f10d30516149c624e6b9e3dc9
+++ b/80bf2770cdbb9580bc040d49775fccd405f534dc
@@ -1 +1 @@
-file1 v2
\ No newline at end of file
+file1 v4
\ No newline at end of file

如何完成我的代码以获得与 git 相同的输出?

最佳答案

git_diff 是用于基于行的差异的通用接口(interface),因此您可以放置​​用于处理各个行和文件的函数。

如果您正在寻找能够为您提供由 git diff 和类似实用程序生成的文本输出的东西,那么通过 git_patch API 会更容易。

你可以调用

git_patch_from_blobs()

这会给你一个 git_patch 对象,然后你可以将其传递给

git_patch_to_buf()

这会将内容以统一的 diff 格式写入 git_buf,您可以使用它打印到您想要的任何文件/屏幕。

您也可以通过提供一些回调来手动完成,这些回调会将信息添加到您选择的某些数据结构中,然后您可以将其转换为统一差异或并排或其他任何形式,但对于您提到的用户案例,通过补丁 API 就容易多了。

关于c++ - libgit2 - 两个文本 blob 的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22907806/

相关文章:

c++ - 加快 R 性能或将 R 函数转换为 C++ 函数

git - Jenkins 管道如何与 monorepo 一起工作

c++ - 如果语句包含宏,则 clang 无法替换语句

c - C中的DWORD和HANDLE类型有什么区别?

c - 如何创建通用的 C 自由函数

c - Flex & Bison : "true" being interpreted as and ID

git - 以编程方式从 Git 存储库中读取文件和信息

git - 在单独的 Git 存储库中跨多个项目进行一致标记

c++ - 在两个枚举之间重载转换运算符

c++ - apientry dllmain 出错