Как контролировать преобразование концов строк с помощью LibGit2Sharp?

Я использую LibGit2Sharp для доступа к удаленному репозиторию Git. Сценарий следующий:

  1. Клонируйте репозиторий с удаленного URL-адреса, используя метод Repository.Clone.
  2. Получить из удаленного репозитория с помощью метода Commands.Fetch.
  3. Перейдите к нужному коммиту по тегу commit = repo.Tags["myTag"].PeeledTarget as Commit;
  4. Получите дерево коммитов tree = commit.Tree
  5. Перейдите по дереву и получите файл blob blob = tree["my path"].Target as Blob
  6. Получить содержимое файла из большого двоичного объекта blob.GetContentStream()

В результате я получаю текст файла с окончаниями строк Unix, как он хранится в репозитории. Но я предпочитаю, чтобы в моей локальной копии были окончания строк Windows.

Мне нужно, чтобы Git автоматически преобразовывал для меня окончания строк, как это делается с опцией конфигурации core.autocrlf. Как мне это сделать с LibGit2Sharp?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
256
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проверьте, подтверждает ли LibGit2Sharp.Tests/BlobFixture.cs, что core.autocrlf активен:

    [InlineData("false", "hey there\n")]
    [InlineData("input", "hey there\n")]
    [InlineData("true", "hey there\r\n")]
    public void CanGetBlobAsFilteredText(string autocrlf, string expectedText)
    {
        SkipIfNotSupported(autocrlf);

        var path = SandboxBareTestRepo();
        using (var repo = new Repository(path))
        {
            repo.Config.Set("core.autocrlf", autocrlf);

            var blob = repo.Lookup<Blob>("a8233120f6ad708f843d861ce2b7228ec4e3dec6");

            var text = blob.GetContentText(new FilteringOptions("foo.txt"));

            Assert.Equal(expectedText, text);
        }
    }

Однако обратите внимание, как указано в libgit2/libgit2sharp проблема 1195#:

notes, core.autocrlf is terrible and deprecated and should very much be avoided in favor of a properly configured .gitattributes everywhere.

ОП C-F подтверждает в комментариях:

Apparently I have to check the type of the blob using IsBinary property and use GetContentText or GetContentStream accordingly

Спасибо за быстрый ответ! На самом деле, мой вопрос был немного неточным, потому что я использовал blob.GetContentStream, а не blob.GetContentText (я только что обновил вопрос). Интересно, имеет ли это какое-то значение...

C-F 30.05.2019 07:08

@C-F Можете ли вы протестировать blob.GetContentText?

VonC 30.05.2019 07:09

Да, в этом была разница! Очевидно, мне нужно проверить тип блоба, используя свойство IsBinary, и соответственно использовать GetContentText или GetContentStream.

C-F 30.05.2019 07:15

@ C-F Хорошо, я включил ваш комментарий в ответ для большей наглядности.

VonC 30.05.2019 07:17

Привет, это снова я. Мой предыдущий комментарий был неправильным. Я торопился и не проверил как следует. Теперь я вижу, что даже метод GetContentText не переводит окончания строк в текстовом файле (имеющем blob.IsBinary == false). Я проверил repo.Config, и он содержит core.autocrlf = "true", а также core.safecrlf = "true" (что бы это ни значило). Итак, я в основном там, где начал... Вернемся к вашему первоначальному ответу: вы предлагаете мне запустить данный тест против библиотеки? Как это может помочь?...

C-F 31.05.2019 11:34

Это может помочь проверить правильность преобразования конца строки.

VonC 31.05.2019 13:28

Я боролся с точно такой же проблемой.

Чтобы получить правильное окончание строк, вам нужно вызвать blob.GetContentStream(new FilteringOptions(relativePath)). Название на самом деле не говорит само за себя, но оно вызовет другую функцию (git_blob_filtered_content_stream), которая вернет контент с преобразованными EOL.

https://github.com/libgit2/libgit2sharp/blob/master/LibGit2Sharp/Blob.cs#L56

Другие вопросы по теме

Похожие вопросы

Почта другой стороны получила только открытый текст, без файла исправления. Я отправил сообщение, используя $ git send-email *.patch
Git: Как вывести список всех веток, созданных из определенной ветки?
Учитывая длинный коммит git, как безопасно получить короткий коммит
Фатальный: pathspec '.' не нашел ни одного файла при попытке git rm
Почему моя командная строка дает другую информацию, чем визуальная студия, при проверке состояния репозитория git?
Git игнорирует скомпилированный CSS, но сохраняет последнюю версию для состояния готовности к работе
Как сделать вилку с открытым исходным кодом, полученную из проекта с закрытым исходным кодом?
Получить количество измененных строк кода из репозитория GitHub
Перебазирование фиксации от одного родителя к другому
Будет ли интерактивная перебазировка git, которая удаляет фиксацию, действительно удалить раскрытие ключей/секретов/паролей API?