Как применить правила различий языков в gitattributes

Например, файл .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?


person Aimeast    schedule 13.01.2014    source источник
comment
Какую версию Libgit2Sharp вы используете?   -  person nulltoken    schedule 13.01.2014
comment
Последний выпуск @nulltoken от nuget для среды разработки и HEAD для исследований.   -  person Aimeast    schedule 14.01.2014


Ответы (1)


На самом деле это проблема драйверов различий и правил контекста пользовательских функций для различий, а не одного из атрибутов.

Эти файлы имеют атрибут diff=csharp; проблема в том, что этот атрибут ничего не значит для libgit2.

Когда git и libgit2 генерируют различия, они используют регулярные выражения, чтобы найти имя функции, в которой встречается фрагмент различий. У них также есть правило отката, если регулярное выражение недоступно для поиска первой строки, которая не начинается с пробела.

git содержит таблицу встроенных драйверов diff, которая включает определение csharp Водитель.

libgit2 не содержит этой таблицы (как обсуждалось в PR, объединяющем поддержку драйверов diff) и, следовательно, не имеет встроенного представления о том, какой шаблон использовать для diff=csharp.

Ваши альтернативы для решения этой проблемы:

  1. Сделайте запись в файле .git/config (или файле $HOME/.gitconfig), которая реализует diff.csharp.xfuncname с шаблоном для поиска, или
  2. Запустите запрос на извлечение для libgit2, который импортирует определения драйверов. Проблема с импортом (и причина, по которой я не взялся за это) заключается в том, что потребуется получить разрешение от первоначальных авторов кода на повторное лицензирование его для использования в libgit2).

Если вы решите запустить запрос на вытягивание и получите согласие автора шаблонов xfuncname CSharp на повторное лицензирование кода для libgit2, дайте мне знать, и я буду рад сотрудничать с фактической реализацией!

person arrbee    schedule 13.01.2014
comment
Я хотел бы попробовать добавить шаблон сравнения для csharp, но я очень плохо разбираюсь в C, даже я не знаю, как скомпилировать файл libgit2. Не могли бы вы указать, как это реализовать. Благодарю вас! - person Aimeast; 14.01.2014
comment
@Aimeast Подойдет это ваша потребность? - person nulltoken; 14.01.2014
comment
@Aimeast Боюсь, это не лучший стартовый проект для добавления кода C в libgit2. Не существует простого хука для подключения шаблонов из ядра Git в libgit2; это потребует добавления нового механизма в какой-то существующий и несколько сложный код. Не стесняйтесь подавать запрос на добавление функции в libgit2 (в качестве проблемы), и мы можем продолжить обсуждение там. - person arrbee; 15.01.2014
comment
В качестве продолжения был объединен github.com/libgit2/libgit2/pull/2066, который добавляет встроенные драйверы diff в libgit2, поэтому diff=csharp теперь должно соответствовать поведению обычного Git. - person arrbee; 31.01.2014