Работа с филиалами в Дульвиче (доступ к объектам / оформление заказа)

У меня проблема с Dulwich (переключился на него с GitPython из-за известной ошибки Windows с открытыми файлами в папке.git).

Я пытаюсь получить файл из другой ветки открытого в данный момент репо (его состояние из последнего коммита). В GitPython эту задачу можно легко и просто решить:

file_object = repo.heads[BRANCH].commit.tree[FILENAME]

Но я не нашел удобного способа иметь дело с филиалами в Далвиче.

При написании этого вопроса я нашел get_refs метод, который возвращает словарь со всеми ссылками и указанными коммитами. Теперь я думаю, что могу получить SHA последнего коммита, но с ссылками работать очень недружелюбно - мне нужно использовать такую ​​форму, чтобы получить коммит:

commit_id = repo.get_refs()[b"refs/heads/develop"]

После этого я могу получить свой файл следующим образом:

    tree_path = porcelain.path_to_tree_path(REPO_ROOT, os.path.join(REPO_ROOT, FILENAME))
    _, object_sha = tree_lookup_path(repo.get_object, repo[commit_id].tree, tree_path)
    file_object = repo[object_sha].data

Есть ли правильный (более "питонический"/"гитонический") способ получить нужную версию файла без полной проверки ветки? Некоторые промежуточные / неотмеченные файлы могут быть сохранены в хранилище в момент запуска программы, и я предполагаю, что они прервут процесс оформления заказа.
Теперь главная проблема для меня - необходимость "упаковать" обычное имя ветки в форму "refs /heads".
И если нет более точного способа получить эту информацию - надеюсь, мой вопрос может кому-то помочь в будущем:)

Python: 3.6.1
Дульвич: 0,19,6

1 ответ

В последних версиях Dulwich вы можете использовать get_object_by_path (от dulwich.porcelain):

print get_object_by_path(x, "some/file/path", "somebranch").data

В старых версиях самый короткий способ сделать это (где x - хранилище):

mode, object_sha = tree_lookup_path(
      x.__getitem__, x['refs/heads/master'].tree, 'some/file/path')
x[object_sha].data
Другие вопросы по тегам