C# LibGit2Sharp blob.GetContentText()不返回\r\n

C# LibGit2Sharp blob.GetContentText()不返回\r\n,c#,git,repository,libgit2,libgit2sharp,C#,Git,Repository,Libgit2,Libgit2sharp,我试图从存储库中获取一个文件 blob.GetContentText() 此文件包含“\r”。在我看来,LibGit2Sharp删除了这个字符。 是否有可能在不做任何更改的情况下获得真实内容 更新1 我在文本文件中包含以下内容: test1 \r\n test2 \r\n test2 \r\n 我提交了该文件,并且\r\n可以使用git cat file返回 如果我试图通过LibGit2Sharp获取内容,则只能获取\n 我尝试了GetContextString()以及以下使用不同编码的代码

我试图从存储库中获取一个文件

blob.GetContentText()
此文件包含“\r”。在我看来,LibGit2Sharp删除了这个字符。 是否有可能在不做任何更改的情况下获得真实内容

更新1 我在文本文件中包含以下内容:

test1 \r\n
test2 \r\n
test2 \r\n
我提交了该文件,并且\r\n可以使用git cat file返回

如果我试图通过LibGit2Sharp获取内容,则只能获取\n

我尝试了GetContextString()以及以下使用不同编码的代码:

    Blob blob = (Blob)treeEntry.Target;

    string content;
    using (var tr = new StreamReader(blob.GetContentStream(), Encoding.UTF8))
    {
        content = tr.ReadToEnd();
        MessageBox.Show(content);
    }
默认情况下,
GetContentText()
不会执行任何cr/lf替换。只有接受
过滤器选项的重载才允许这样做

GetContextText()
将仅尝试将默认UTF8应用于UTF16编码转换。这可以通过显式传递
Blob
内容的编码来覆盖

是否有可能在不做任何更改的情况下获得真实内容

使用
GetContentStream()
。它将返回blob的原始内容

您可以浏览一下测试套件,以更好地了解这些方法及其行为

此文件包含“\r”

考虑到上面的解释,blob在git对象数据库中实际包含这个字符的可能性很大。您可以通过命令和十六进制编辑器对此进行双重检查

注意:如果您在库中发现错误,请在中提出一个问题,并附上一个复制案例。我们会很高兴地把它修好的

多亏了埃索姆森:


这一行就是诀窍。

我有一个文件内容:“test\r\n test2\r\n test3\r\n”我尝试了GetContentText()和GetContentStream()的不同编码。两者都只在一行末尾返回\n。存储库中存在\r\n。如果不传递
FilteringOptions
参数,
GetContentStream()
将委托给不执行crlf替换的libgit2。因此,如果存储库中有一个CRLF,它将按原样返回,而不是通过此方法在LF中转换。但是,如果您传入一个
FiletringOptions
,将根据.gittributes文件中定义的规则,使用
hintpath
执行替换。如果上面的评论没有帮助,并且您仍然遇到问题,您能分享一段完整的代码来演示它吗?我编辑了第一篇文章。这就是我试图获取内容的方式。正如我所说,我还尝试了GetContentText(),但没有传递任何过滤选项……尽管这一惊人的结果可能帮助您解决了问题,但我认为这个答案与最初的问题无关。在您的上下文中,将此配置项设置为false只能防止
Stage()
在对象数据库中插入blob时将CRLF动态转换为LF。此设置对
GetContentText()
GetContentStream()
的行为方式没有影响。没错,您的答案与我最初的问题是正确的!你的回答总是帮助我更好地理解LibGit2Sharp。问题不是我所想的GetContentText()或GetContentStream()。然而,这帮助我解决了我的问题,对其他有同样问题的人也有帮助。:)
repo.Config.Set("core.autocrlf", false);