2

我注意到我可以通过像这样遍历树的孩子来从特定分支获取特定叶子(blob)对象的内容:

      _repository = new Repository(git_url);

      IEnumerable<AbstractObject> currentBranchItems = _repository.CurrentBranch.CurrentCommit.Tree.Children;

               foreach (var currentBranchItem in currentBranchItems)
               {
                   var currentBranchLeaf = currentBranchItem as Leaf;
                   _lastLeafHash = currentBranchLeaf.Hash;
                   Console.WriteLine("Name: " + currentBranchLeaf.Name + " Hash: " + currentBranchLeaf.Hash);
               }

但是,如果我有想要检索的叶子的哈希值,这似乎效率很低。如果我有哈希,有没有办法可以直接从存储库访问 Leaf?以下不起作用:

 private static void GetLeafByHash(string hash)
       {
               var leafAbs = _repository.Get<AbstractObject>(hash);
               var leaf = leafAbs as Leaf;
               Console.WriteLine("Found Leaf Named: " + leaf.Name);
               Console.WriteLine("The data is this big: " + leaf.RawData.Length);
               Console.Read();        
       }

Get 方法始终返回 NULL。那么有没有办法通过哈希来完成对叶子的直接检索呢?该文档说明了有关 Get 方法的以下内容:

按名称、id 或路径访问 git 对象。使用 type 参数来告诉你想要得到什么样的对象。支持的类型是分支、提交或标签,可以通过名称或引用表达式访问。当前支持以下组合: 不支持树或叶子 (Blob) 对象可以通过长散列或它们的相对存储库路径来寻址

目前尚不清楚..这是否意味着可以或不能通过哈希访问 Tree 或 Leaf 对象?

非常感谢!

4

1 回答 1

2

您可以像这样以 Blob 的形式在 repo 中获取任何对象

var blob=repo.Get<Blob>(sha_hash);

如果您知道对象的类型(树、标签或提交),您还可以在 Get() 中将类型参数 Tree、Tag 和 Commit 替换为 T。

旁注:在 GitSharp 中,叶子是一个 Blob,它知道它在当前修订的树中的路径。但是,由于文件可以位于不同分支和修订版的许多地方,因此您无法通过 Repository.Get() 获得 Leaf。

于 2011-10-02T05:28:36.480 回答