你所追求的是树比较功能,已经存在于libgit2 https://www.github.com/libgit2/libgit2定义如下树.h头文件 https://github.com/libgit2/libgit2/blob/f25cc58d5cd630aa379bf894c5b78feb824bb647/include/git2/tree.h#L335-348.
The git_tree_diff()
函数比较两个Trees
并对每个差异(添加、更新和删除)调用回调。回调函数被传递git_tree_diff_data
结构,其中包含所考虑的 blob 的文件路径、其状态、以前和当前的文件模式以及以前和当前的 SHA。
从 LibGit2Sharp 的角度来看,更有意义利用现有的 libgit2 功能而不是用 C# 重新实现它们。然而,即使你可以从现有的互操作定义 https://github.com/libgit2/libgit2sharp/blob/master/LibGit2Sharp/Core/NativeMethods.cs,当试图驯服 .Net/native 互操作层时,事情往往会很快变得棘手。
从你的角度来看(因为为 LibGit2Sharp 做出贡献可能不是您的主要目标;)), 另一种选择是将 C 代码移植到 C#,依靠 LibGit2Sharp 现有的功能来走下树。git_tree_diff()
(及其卫星功能)是一段非常干净的代码,尽管它完成了相当复杂的工作,但注释非常清晰且有帮助。
参考:
- The
git_tree_diff()
函数实现于src/tree.c https://github.com/libgit2/libgit2/blob/f25cc58d5cd630aa379bf894c5b78feb824bb647/src/tree.c#L876
- 可以进行行使此功能的测试here https://github.com/libgit2/libgit2/blob/f25cc58d5cd630aa379bf894c5b78feb824bb647/tests-clar/object/tree/diff.c
Note:为了绑定git_tree_diff()
,应该在以下位置打开一个问题libgit2 跟踪器 https://www.github.com/libgit2/libgit2/issues要求更新方法定义以便GIT_EXTERN
'd。否则将无法从 .Net 访问它。
UPDATE
Release v0.9.0LibGit2Sharp 最终带来了 Tree to Tree diffing 功能。
TreeChanges changes = repo.Diff.Compare(fromTree, newTree);
暴露的属性有:
- 添加/修改行
- 每种更改的 TreeEntry 更改的集合(例如添加、修改……)
- 差异补丁
您可以找到有关此功能以及如何利用的更多信息TreeChanges
通过查看DiffTreeToTreeFixture.cs 中的单元测试 https://github.com/libgit2/libgit2sharp/blob/v0.9.0/LibGit2Sharp.Tests/DiffTreeToTreeFixture.cs.