使用 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;
有一个裸存储库,我有一个提交 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;