【问题标题】:Read the files at the spesific commit with libgit2sharp使用 libgit2sharp 读取特定提交中的文件
【发布时间】:2015-05-16 14:51:35
【问题描述】:

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

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

怎么做?

【问题讨论】:

  • 您能否详细说明“但我还想要该级别存在的其他文件”。要求。我不确定是否真正了解您的需求。
  • "git checkout " 命令更新工作目录中的所有文件以匹配指定的提交。我想在一个裸存储库中获得相同的功能,而无需克隆它。

标签: libgit2sharp


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 2015-07-24
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多