使用 libgit2sharp 获取提交与其父级之间的更改

2024-04-18

我正在使用 libgit2sharp(libgit2 的 C# 包装器),并且遇到了问题,因为它没有很多我希望的功能(希望我能尽快为它做出贡献;这似乎是一个非常有用的项目)

我现在想做的事情是获取从特定提交及其父级更改的文件列表。我不会试图弄清楚合并与其两个父级之间发生了什么变化。我对定期提交更感兴趣。

这些人(https://github.com/libgit2/libgit2sharp/issues/89)正在研究类似的东西。我认为他们的程序是一个好主意,但我对 GIT 内部结构的理解有点薄弱(GIT 最终用户指南上有很多指南,但内部结构方面的指南不多)

我很好奇 GIT 本身是如何执行“git diff”命令的。据说 GIT 实际上并不存储增量,而是文件的完整版本(如果未更改,它将仅指向现有的 SHA。可以从各种来源找到此信息,例如此处http://xentac.net/2012/01/19/the-real-difference- Between-git-and-mercurial.html http://xentac.net/2012/01/19/the-real-difference-between-git-and-mercurial.html)。这似乎使得获取两个提交之间的更改变得更加困难(在我的例子中是一个特定的提交及其单亲),因为数据没有存储为提交的一部分(如果您检查 libgit2sharp 的 Commit.cs 中的 Commit 类,这一点就很清楚了文件)。

我可以从提交中访问的是树。执行以下操作来查找此信息是否有意义:

1) 从所需的提交开始,沿着树向下走,并将所有 SHA 值存储在一个集合中。

2) 从所需提交的父级开始,沿着其树向下走,将其所有 blob SHA 值存储在另一个集合中。

3) 已更改文件的 SHA 将是不在两个集合的交集中的文件。

我看到这种方法的问题是,它看起来没有办法从 blob SHA 值获取文件名(我在 libgit2sharp Blob.vs 文件中没有看到任何可以做到这一点的东西)。

我知道这个问题有很多方面,但它们是从 git 获取特定数据这一大目标的一部分。

Thanks.


你所追求的是树比较功能,已经存在于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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 libgit2sharp 获取提交与其父级之间的更改 的相关文章

随机推荐

  • PHP语句同步或异步

    早上好 我想知道 PHP 准备语句是同步还是异步 例如 req1 UPDATE statement1 connection gt prepare req1 statement1 gt execute req2 SELECT statemen
  • 锁定一个物体

    我经常看到这样的代码此处显示 http msdn microsoft com en us library ak9w5846 aspx 即分配一个对象 然后将其用作 锁定对象 在我看来 您可以使用任何对象来实现此目的 包括事件本身作为锁定对象
  • 如何将变音符号更改为非变音符号[重复]

    这个问题在这里已经有答案了 我在 stackoverflow 上找到了如何删除变音符号的答案 但是您能否告诉我是否可以将变音符号更改为非变音符号 哦 我想到了 NET 或者其他 如果不可能的话 由于没有人费心发布代码来执行此操作 因此它是
  • Room IllegalArgumentException:int 无法转换为元素

    我在尝试编译项目时遇到此错误 错误 任务 app compileDebugJavaWithJavac 执行失败 java lang IllegalArgumentException int无法转换为元素 还有这个警告 警告 注释处理器 an
  • MariaDb 10 条件(其中 id = '1')返回与 id ='1a' 相同的结果

    我创建以 id 作为主键和 int 自动增量的表 用这个脚本 CREATE TABLE devel pos menu id INT NOT NULL AUTO INCREMENT title VARCHAR 100 NULL DEFAULT
  • 向后迭代字符串字符的好方法是什么?

    向后迭代字符串中的字符的最 Swiftian 方法是什么 即喜欢for ch in str 仅相反 我想我一定错过了一些明显的东西 因为我现在能想到的最好的办法是 for var index str endIndex index str s
  • Python docx在保持样式的同时替换段落中的字符串

    我需要帮助替换 Word 文档中的字符串 同时保留整个文档的格式 我正在使用 python docx 在阅读文档后 它适用于整个段落 因此我松散了格式 例如粗体或斜体的单词 包括要替换的文本以粗体显示 我想保持这种状态 我正在使用这段代码
  • 使用 Apache POI 检测所需的打印方向

    我正在使用 Apache POI 创建 xls 电子表格 有没有办法检测数据是否适合纵向模式或者是否必须将工作表设置为横向模式 我知道如何设置模式 但不知道如何确定数据是否适合当前的打印方向 HSSFPrintSetup printSetu
  • 追加到 txt 文件中的现有行

    我有一个程序可以将一个人的姓名及其分数存储在 python 的 txt 文件中 例如这是我当前的代码 name input Name score input Score file name student scores txt file o
  • 开始在现有代码库中进行自动化集成/单元测试

    背景 我们已经移交了一个非常大的代码库 140 万行 主要是 C 语言 该应用程序主要由 asp net 2 0 样式的 asmx Web 服务组成 用于访问 SQL Server 2008 数据库以及各种 XML 文件中的数据 没有现有的
  • .NET 4 上的 ASP.NET 导致 IE11 throw _doPostBack is undefined javascript 错误

    编辑 该站点位于 Windows Server 2003 上 因此无法升级到 NET Framework 4 5 我们的网站正在为 NET 4 上的 ASP NET 提供服务 使用 IE 11 时 自动回发停止工作 并出现错误 doPost
  • 仅在运行 Android 12 的 Pixel 设备上出现 CannotDeliverBroadcastException

    我发现 Crashlytics 发生了崩溃 但我无法重现或找到其原因 该崩溃仅发生在运行 Android 12 的 Google Pixel 设备上 并且崩溃始终发生在后台 这是来自 Crashlytics 的崩溃日志 Fatal Exce
  • 用于属性说明的 HTML5 标签

    引用 HTML5 最终规范 http www w3 org TR html5 forms html attr label for http www w3 org TR html5 forms html attr label for The
  • 如何在 OS X 上像屏幕截图选择一样绘制矩形?

    矩形如何重绘 这是在 NSWindow 上吗 还是NSScreen 我怎样才能在 OS X 原生的 API 上做到这一点 谢谢 None
  • 分发Windows C++库:如何决定是创建静态库还是动态库?

    我们一直在将 Java 和 NET API 库转换为 C 并试图找出将编译版本分发给其他开发人员以与他们的自定义应用程序一起使用的最佳方法 应该是静态库还是动态库 我们需要为 Win32 和 Win64 创建 我想每个目标操作系统都有调试版
  • 实体框架:在运行时添加属性/实体

    我想使用实体框架 但是 我还要求允许我的用户在我们的系统中定义自定义字段 我想仍然使用实体框架 而不是使用具有哈希表属性的分部类 下面是我想到的解决方案 但是它并不简单 所以我想看看是否有更好的方法 我目前的想法是拥有一个 ModelMan
  • 如何调整 Plotly 条形高度并仅显示条形边缘(在子图中)?

    这是我第一次涉足 Plotly 与 matplotlib 和 bokeh 相比 我喜欢它的易用性 然而 我陷入了一些关于如何美化我的情节的基本问题 首先 这是下面的代码 其功能齐全 只需复制并粘贴即可 import plotly expre
  • IOs7 应用程序在后台崩溃

    我的应用程序有时会在后台崩溃并显示以下崩溃日志 Nov 7 12 33 31 iPad backboardd 29
  • XCTest 应用程序测试和权限警报

    我正在编写 XCTest 应用程序测试来测试一些UIViewControllers通过致电presentViewController on the UIApplication rootViewController 除了权限对话框之外 这工作
  • 使用 libgit2sharp 获取提交与其父级之间的更改

    我正在使用 libgit2sharp libgit2 的 C 包装器 并且遇到了问题 因为它没有很多我希望的功能 希望我能尽快为它做出贡献 这似乎是一个非常有用的项目 我现在想做的事情是获取从特定提交及其父级更改的文件列表 我不会试图弄清楚