c# - 如何使用 LibGit2Sharp 在 Git 上获取文件内容?

标签 c# .net git version-control libgit2sharp

我检查了 BlobFixture.cs 中的代码,发现了一些有关读取文件内容的测试,如下所示。

using (var repo = new Repository(BareTestRepoPath))
{
    var blob = repo.Lookup<Blob>("a8233120f6ad708f843d861ce2b7228ec4e3dec6");

    var contentStream = blob.GetContentStream();
    Assert.Equal(blob.Size, contentStream.Length);

    using (var tr = new StreamReader(contentStream, Encoding.UTF8))
    {
        string content = tr.ReadToEnd();
        Assert.Equal("hey there\n", content);
    }
}

但是我找不到根据文件名获取文件内容的测试。是否可以这样做?如果可以,怎么做?

最佳答案

每个 Tree 都包含一个 TreeEntry 集合。 TreeEntry 包含关于指向 GitObject 的一些元数据(名称、模式、oid 等)。 GitObject 可以通过 TreeEntry 实例的 Target 属性访问。

大多数时候,TreeEntry 会指向一个Blob 或另一个Tree

Tree 类型公开了一个索引器,该索引器接受一个路径以轻松检索最终指向的 TreeEntry。作为一种方便的方法,Commit 也公开了这样一个索引器。

因此您的代码可以这样表达。

using (var repo = new Repository(BareTestRepoPath))
{
    var commit = repo.Lookup<Commit>("deadbeefcafe"); // or any other way to retreive a specific commit
    var treeEntry = commit["path/to/my/file.txt");

    Debug.Assert(treeEntry.TargetType == TreeEntryTargetType.Blob);
    var blob = (Blob)treeEntry.Target;

    var contentStream = blob.GetContentStream();
    Assert.Equal(blob.Size, contentStream.Length);

    using (var tr = new StreamReader(contentStream, Encoding.UTF8))
    {
        string content = tr.ReadToEnd();
        Assert.Equal("hey there\n", content);
    }
}

关于c# - 如何使用 LibGit2Sharp 在 Git 上获取文件内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22034239/

相关文章:

c# - 通用 Windows 应用程序中的全局热键

.Net 正则表达式 - 正向前瞻不起作用

GitHub:如何显示文件夹中所有文件的提交

c# - 将 out 修饰符的值返回到 C# 中的集合

c# - 单元测试重组

c# - DocuSign 连接 Webhook 与 .Net Core 3

c# - 使用反射 C# 获取 JsonProperty 属性的名称

c# - 使用 .NET 时如何限制文件碎片?

git - 使用相同的代码库维护多个版本

git - 如何从 Mac 卸载 Git (Apple Git-75)?