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

Read the files at the spesific commit with libgit2sharp

有一个裸存储库,我有一个提交 ID,并且想在不克隆的情况下读取该提交时的所有文件。

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

怎么做?

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

为了让您更轻松地对其进行测试,它会在控制台输出中转储信息(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

例如:

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