У меня проблема с Dulwich (переключается на нее с GitPython из-за известной ошибки Windows с открытыми файлами в папке.git).
Я пытаюсь получить файл из другой ветки открытого в настоящее время репо (его состояние от последнего фиксации). В GitPython эту задачу можно решить красиво и просто:
file_object = repo.heads[BRANCH].commit.tree[FILENAME]
Но я не нашел удобного способа общаться с веткими в Дульвиче.
При написании этого вопроса я нашел метод get_refs
который возвращает словарь со всеми get_refs
и get_refs
которые они указывают. Теперь я думаю, что могу получить SHA от последнего коммита, но refs очень недружелюбив в работе - мне нужно использовать такую форму для получения фиксации:
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
Есть ли правильный (более "питонический"/"gitonic") способ получить нужную версию файла без полной проверки ветки? Некоторые поэтапные/неустановленные файлы могут быть сохранены в репо в момент запуска программы, и я полагаю, что они прервут процесс проверки.
Теперь главной проблемой для меня является необходимость "упаковать" обычное название ветки в форму "refs/heads/".
И если нет более точного способа получить эту информацию - надеюсь, мой вопрос может помочь кому-то в будущем :)
Python: 3.6.1
Далвич: 0,19,6
В последних версиях dulwich вы можете использовать get_object_by_path
(from 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