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);