Может ли GitSharp возвращать листовой (blob) объект непосредственно с учетом хэша листа?

#c# #git #gitsharp

#c# #git #gitsharp

Вопрос:

Я заметил, что я могу получить содержимое определенного листового (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);
               }
  

Однако это кажется довольно неэффективным, если у меня есть хэш листа
, который я хотел бы получить. Есть ли способ, которым я могу получить доступ к листу
непосредственно из репозитория, если у меня есть хэш? Следующее
не работает:

  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:

Доступ к git-объекту по имени, идентификатору или пути. Используйте параметр type, чтобы указать, какой объект вы хотите получить. Поддерживаемые типы ветвей, коммитов или тегов могут быть доступны по имени или ссылочному выражению. В настоящее время поддерживаются следующие комбинации: не поддерживается Дерево или листовые (Blob) объекты могут быть адресованы с помощью длинного хэша или их относительного пути к репозиторию

Неясно .. означает ли это, что к объектам дерева или листа можно или нельзя получить доступ через хэш?

Большое спасибо!

Ответ №1:

Вы можете получить любой объект в репозитории в виде двоичного объекта следующим образом

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

Если вы знаете тип объекта (дерево, тег или коммит), вы также можете заменить параметры типа Tree, Tag и Commit для T в Get().

Примечание: в GitSharp лист — это большой двоичный объект, который знает свой путь в дереве текущей ревизии. Однако, поскольку файл может находиться во многих местах в разных ветвях и ревизиях, вы не можете получить лист через Repository.Get() .