如何使用 LibGit2Sharp 控制行尾转换?
How do I control line endings conversion with LibGit2Sharp?
我正在使用 LibGit2Sharp 访问远程 Git 存储库。场景如下:
- 使用
Repository.Clone
方法从远程 URL 克隆存储库。
- 使用
Commands.Fetch
方法从远程存储库中获取。
- 通过标签导航到所需的提交
commit = repo.Tags["myTag"].PeeledTarget as Commit;
- 获取提交树
tree = commit.Tree
- 导航树并获取文件 blob
blob = tree["my path"].Target as Blob
- 从 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
我正在使用 LibGit2Sharp 访问远程 Git 存储库。场景如下:
- 使用
Repository.Clone
方法从远程 URL 克隆存储库。 - 使用
Commands.Fetch
方法从远程存储库中获取。 - 通过标签导航到所需的提交
commit = repo.Tags["myTag"].PeeledTarget as Commit;
- 获取提交树
tree = commit.Tree
- 导航树并获取文件 blob
blob = tree["my path"].Target as Blob
- 从 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 useGetContentText
orGetContentStream
accordingly
我正在为完全相同的问题而苦苦挣扎。
要获得正确的行尾,您需要调用 blob.GetContentStream(new FilteringOptions(relativePath))
。该名称并不是真正的自我解释,但它会调用一个不同的函数 (git_blob_filtered_content_stream
),该函数将 return 具有转换后的 EOL 的内容。
https://github.com/libgit2/libgit2sharp/blob/master/LibGit2Sharp/Blob.cs#L56