如何在gitattributes中应用语言的diff规则

时间:2014-01-13 16:22:26

标签: libgit2 libgit2sharp

例如,.gitattributes的{​​{1}}文件包含行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 libgit2/#508,但PR Add .gitattributes support libgit2/#516是否已合并?

现在支持多少种语言?

我们可以指定没有Add APIs for git attributes文件的规则吗?

1 个答案:

答案 0 :(得分:6)

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

这些文件确实具有diff=csharp属性;问题是该属性对libgit2没有任何意义。

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

git包含table of built in diff drivers,其中包含csharp驱动程序的定义。

libgit2不包含该表(如in the PR that merged diff driver support所述),因此没有关于diff=csharp使用什么模式的内置概念。

解决这个问题的替代方法是:

  1. 在您的.git/config文件(或您的$HOME/.gitconfig)中输入一个条目,该文件使用要搜索的模式实现diff.csharp.xfuncname,或
  2. 启动一个拉取请求到导入驱动程序定义的libgit2。导入的问题(以及我没有接受它的原因)是它将涉及获得代码原始作者的许可以重新许可它以便在libgit2中使用。)
  3. 如果你决定启动一个Pull Request,并且你得到了CSharp xfuncname模式的作者同意重新许可libgit2的代码,请告诉我,我很乐意就实际实施进行合作!