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

时间:2019-05-30 04:43:44

标签: git libgit2sharp line-endings

我正在使用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 config选项一样。如何使用LibGit2Sharp做到这一点?

2 个答案:

答案 0 :(得分:0)

检查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#中所述:

  

请注意,core.autocrlf非常糟糕且已过时,应避免在任何地方使用正确配置的.gitattributes

OP C-F确认in the comments

  

显然,我必须使用IsBinary属性检查blob的类型,并相应地使用GetContentTextGetContentStream

答案 1 :(得分:0)

我正为同样的问题而苦苦挣扎。

要获得正确的行尾,您需要致电<html> <head> ... </head> <body> <?php include('file.php'); ?> </body> <html> 。该名称并不是真正的自我解释,而是将调用一个不同的函数(<?php <html>),该函数将返回具有转换后的EOL的内容。

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