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

1

У меня проблема с 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

Теги:
python-3.x
gitpython
dulwich

1 ответ

0

В последних версиях 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
  • 0
    Вау! Действительно хорошее улучшение, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню