2

例如,.gitattributes文件lg2s*.cs diff=csharp. 代码的输出

using (var repo = new Repository(@"path\to\lg2s"))
{
    var tree1 = repo.Lookup<Commit>("a845db9").Tree;
    var tree2 = repo.Lookup<Commit>("d677741").Tree;
    var patches = repo.Diff.Compare<Patch>(tree1, tree2);
    foreach (var patch in patches)
    {
        Console.WriteLine(patch.Patch);
    }
}

是(不久)

diff --git a/LibGit2Sharp/RepositoryStatus.cs b/LibGit2Sharp/RepositoryStatus.cs
@@ -59,8 +59,8 @@ namespace LibGit2Sharp

但输出git bash是(很快)

diff --git a/LibGit2Sharp/RepositoryStatus.cs b/LibGit2Sharp/RepositoryStatus.cs
@@ -59,8 +59,8 @@ internal RepositoryStatus(Repository repo, StatusOptions optio

第二行不一样。

看起来有一个深入的讨论Add .gitattributes support libgit2/#508,但是 PR Add APIs for git attributes libgit2/#516是否合并?

现在支持多少种语言?

我们可以在没有gitattributes文件的情况下指定规则吗?

4

1 回答 1

6

这实际上是差异驱动程序和差异的自定义函数上下文规则的问题,而不是属性之一。

这些文件确实具有diff=csharp属性;问题是该属性对libgit2.

gitlibgit2生成差异时,它们使用正则表达式来查找出现差异块的函数的名称。如果没有正则表达式可用于查找不以空格开头的第一行,它们还有一个备用规则。

git包含一个内置差异驱动程序表,其中包括驱动程序的定义csharp

libgit2不包含该表(如PR 中所讨论的合并 diff 驱动程序支持),因此没有内置的关于使用什么模式的概念diff=csharp

您解决此问题的替代方法是:

  1. .git/config在您的文件(或您的$HOME/.gitconfig)中diff.csharp.xfuncname创建一个使用要搜索的模式实现的条目,或者
  2. 启动一个拉取请求以libgit2导入驱动程序定义。导入的问题(以及我没有接受它的原因)是它将涉及获得代码原始作者的许可,以重新许可它以用于libgit2)。

如果您决定发起一个拉取请求,并且您让 CSharp xfuncname 模式的作者同意重新许可 的代码libgit2,请告诉我,我将很乐意就实际实施进行合作!

于 2014-01-13T17:36:29.677 回答