使用libgit2sharp读取特定提交中的文件

时间:2015-05-16 14:51:35

标签: libgit2sharp

有一个裸存储库,我有一个提交ID,并希望在没有克隆的情况下读取该提交的所有文件。

这个repository.Lookup<Tree>(repository.Commits.First().Tree.Sha)代码只提供了提交中的文件,但我还想要该级别存在的其他文件。

怎么做?

1 个答案:

答案 0 :(得分:0)

我对您的问题的理解是,您愿意访问提交的全部内容,而不仅仅是提交的第一级。下面的代码将对裸(或标准)存储库起作用,并允许用户递归访问和检查提交的内容。

为了让您更容易测试它,它会在控制台输出中转储信息(git对象元数据和blob内容)。

RecursivelyDumpTreeContent(repo, "", commit.Tree);

[...]

private void RecursivelyDumpTreeContent(IRepository repo, string prefix, Tree tree)
{
    foreach (var treeEntry in tree)
    {
        var path = prefix + treeEntry.Name;
        var gitObject = treeEntry.Target;

        var meta = repo.ObjectDatabase.RetrieveObjectMetadata(gitObject.Id);
        Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", gitObject.Id, treeEntry.Mode, treeEntry.TargetType, meta.Size, path);

        if (treeEntry.TargetType == TreeEntryTargetType.Tree)
        {
            RecursivelyDumpTreeContent(repo, path + "/", (Tree)gitObject);
        }

        if (treeEntry.TargetType == TreeEntryTargetType.Blob)
        {
            Console.WriteLine((((Blob)gitObject).GetContentText()));
        }
    }
}

您是否准确了解您要访问的特定文件的路径,请使用Commit类型公开的索引器,以便直接访问您GitObject的{​​{1}}后。

例如:

var blob = commit["path/to/my/file.txt"].Target as Blob;