Я использую LibGit2Sharp для доступа к удаленному репозиторию Git. Сценарий следующий:
Repository.Clone
.Commands.Fetch
.commit = repo.Tags["myTag"].PeeledTarget as Commit;
tree = commit.Tree
blob = tree["my path"].Target as Blob
blob.GetContentStream()
В результате я получаю текст файла с окончаниями строк Unix, как он хранится в репозитории. Но я предпочитаю, чтобы в моей локальной копии были окончания строк Windows.
Мне нужно, чтобы Git автоматически преобразовывал для меня окончания строк, как это делается с опцией конфигурации core.autocrlf
. Как мне это сделать с LibGit2Sharp?
Проверьте, подтверждает ли 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 useGetContentText
orGetContentStream
accordingly
@C-F Можете ли вы протестировать blob.GetContentText
?
Да, в этом была разница! Очевидно, мне нужно проверить тип блоба, используя свойство IsBinary
, и соответственно использовать GetContentText или GetContentStream.
@ C-F Хорошо, я включил ваш комментарий в ответ для большей наглядности.
Привет, это снова я. Мой предыдущий комментарий был неправильным. Я торопился и не проверил как следует. Теперь я вижу, что даже метод GetContentText
не переводит окончания строк в текстовом файле (имеющем blob.IsBinary == false
). Я проверил repo.Config
, и он содержит core.autocrlf = "true"
, а также core.safecrlf = "true"
(что бы это ни значило). Итак, я в основном там, где начал... Вернемся к вашему первоначальному ответу: вы предлагаете мне запустить данный тест против библиотеки? Как это может помочь?...
Это может помочь проверить правильность преобразования конца строки.
Я боролся с точно такой же проблемой.
Чтобы получить правильное окончание строк, вам нужно вызвать blob.GetContentStream(new FilteringOptions(relativePath))
. Название на самом деле не говорит само за себя, но оно вызовет другую функцию (git_blob_filtered_content_stream
), которая вернет контент с преобразованными EOL.
https://github.com/libgit2/libgit2sharp/blob/master/LibGit2Sharp/Blob.cs#L56
Спасибо за быстрый ответ! На самом деле, мой вопрос был немного неточным, потому что я использовал
blob.GetContentStream
, а неblob.GetContentText
(я только что обновил вопрос). Интересно, имеет ли это какое-то значение...