Может ли GitSharp вернуть объект Leaf (blob) непосредственно с учетом хэша листа?
Я заметил, что я могу получить содержимое определенного объекта Leaf (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:
Доступ к объекту git по имени, идентификатору или пути. Используйте параметр type, чтобы указать, какой объект вы хотите получить. Поддерживаемые типы: ветви, коммиты или теги могут быть доступны по имени или по ссылочному выражению. В настоящее время поддерживаются следующие комбинации: не поддерживается, если объекты Tree или Leaf (Blob) могут быть адресованы длинным хешем или их относительным путем к хранилищу.
Непонятно... означает ли это, что объекты Tree или Leaf могут или не могут быть доступны через хеш?
Большое спасибо!
1 ответ
Вы можете получить любой объект в репо как Blob, как это
var blob=repo.Get<Blob>(sha_hash);
Если вы знаете тип объекта (дерево, тег или фиксация), вы также можете заменить параметры типа Tree, Tag и Commit для T в Get ().
Sidenote: В GitSharp Leaf - это BLOB-объект, который знает свой путь в дереве текущей ревизии. Однако, поскольку файл может находиться во многих местах в разных ветках и ревизиях, вы не можете получить лист через Repository.Get().