如何使用 LibGit2Sharp 控制行尾转换?

How do I control line endings conversion with LibGit2Sharp?

我正在使用 LibGit2Sharp 访问远程 Git 存储库。场景如下:

  1. 使用 Repository.Clone 方法从远程 URL 克隆存储库。
  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 中获取文件内容 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 issue 1195# 中所述:

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

OP C-F confirms :

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

我正在为完全相同的问题而苦苦挣扎。

要获得正确的行尾,您需要调用 blob.GetContentStream(new FilteringOptions(relativePath))。该名称并不是真正的自我解释,但它会调用一个不同的函数 (git_blob_filtered_content_stream),该函数将 return 具有转换后的 EOL 的内容。

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