4

我打算用我的插件替换git.exe来自 Windows 路径的使用,这是一个 Visual Studio 2012 扩展,用于在当前文件的边缘显示 Git Diff。- https://github.com/laurentkempe/GitDiffMarginlibgit2sharpGitDiffMargin

我想知道是否有一个等效的libgit2sharp方法来启动外部 difftool 使用git difftool -y filename

4

1 回答 1

2

我认为启动外部进程不应该是 LibGit2Sharp 的责任。LibGit2Sharp 的目标是提供一种轻松操作 git 存储库的方法。

这意味着您可以使用它来:

  • 获取 workdir 中的文件与先前版本(在索引中)之间的差异。为此,您可以使用Repository.Diff.Compare(IEnumerable<string> paths, bool includeUntracked, ExplicitPathsOptions explicitPathsOptions)重载,它返回一个TreeChanges对象。从那里,您可以TreeEntryChanges通过 treeChanges 的索引器获取一个对象,该对象对应于给定文件的更改(使用 .Patch 属性获取补丁的实际内容)。

  • 使用Repository.Config命名空间获取配置的差异工具(例如:repo.Config.Get<string>("diff.tool").Value,尽管您还应该检查Get()方法返回的值是否为空,以防用户没有配置差异工具)。这样,您可以自己启动差异工具。

其他资源 (v0.11.0):


注意:似乎在某些时候,您需要知道一行是否已更改。我认为现在没有简单的方法可以做到这一点(除了手动解析补丁内容)。但是,在 LibGit2Sharp问题跟踪器上打开一个问题可能会引发一些围绕该问题的讨论(请随意权衡您希望使用哪种 API!)。


编辑:在启动外部差异工具之前,您需要将索引中的文件内容复制到临时文件夹中。您可以通过执行以下操作在索引中查找文件的 blob:

  • var indexEntry = repo.Index[文件名];
  • var blob = repo.Lookup(indexEntry.Id);

但是...当您获取 blob 内容时,当前没有应用过滤器,因此由于 crlf 差异,比较可能会产生误报。目前在 libgit2 上打开了一个问题,以便提出一个允许应用过滤器的 API。

于 2013-05-17T07:56:28.870 回答