Работа с филиалами в Дульвиче (доступ к объектам / оформление заказа)
У меня проблема с 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