Как получить с помощью Dulwich в Python

Я пытаюсь сделать эквивалент git fetch -a используя библиотеку Далвич в Python.

Используя документы по адресу https://www.dulwich.io/docs/tutorial/remote.html я создал следующий скрипт:

from dulwich.client import LocalGitClient
from dulwich.repo import Repo
import os

home = os.path.expanduser('~')

local_folder = os.path.join(home, 'temp/local'
local = Repo(local_folder)

remote = os.path.join(home, 'temp/remote')

remote_refs = LocalGitClient().fetch(remote, local)
local_refs = LocalGitClient().get_refs(local_folder)

print(remote_refs)
print(local_refs)

с существующим Git-репозиторием в ~/temp/remote и недавно инициализированный репо в ~/temp/local

remote_refs показывает все, что я ожидал, но local_refs это пустой словарь и git branch -a на локальный репо ничего не возвращается.

Я что-то упускаю из виду?

Это на Дульвич 0.12.0 и Python 3.5

РЕДАКТИРОВАТЬ #1

После обсуждения канала python-uk irc я обновил свой сценарий, добавив в него использование determine_wants_all:

from dulwich.client import LocalGitClient
from dulwich.repo import Repo

home = os.path.expanduser('~')

local_folder = os.path.join(home, 'temp/local'
local = Repo(local_folder)

remote = os.path.join(home, 'temp/remote')

wants = local.object_store.determine_wants_all
remote_refs = LocalGitClient().fetch(remote, local, wants)
local_refs = LocalGitClient().get_refs(local_folder)

print(remote_refs)
print(local_refs)

но это никак не повлияло:-(

РЕДАКТИРОВАТЬ № 2

Опять же, после обсуждения на канале python-uk irc я попытался запустить dulwich fetch из местного репо. Это дало тот же результат, что и мой скрипт, т.е. удаленные ссылки были правильно выведены на консоль, но git branch -a ничего не показал.

РЕДАКТИРОВАТЬ - Решено

Простой цикл обновления локальных ссылок сделал свое дело:

from dulwich.client import LocalGitClient
from dulwich.repo import Repo
import os

home = os.path.expanduser('~')

local_folder = os.path.join(home, 'temp/local')
local = Repo(local_folder)

remote = os.path.join(home, 'temp/remote')
remote_refs = LocalGitClient().fetch(remote, local)

for key, value in remote_refs.items():
    local.refs[key] = value

local_refs = LocalGitClient().get_refs(local_folder)

print(remote_refs)
print(local_refs)

1 ответ

Решение

LocalGitClient.fetch() не обновляет ссылки, он просто выбирает объекты, а затем возвращает удаленные ссылки, чтобы вы могли использовать их для обновления ссылок целевого репозитория.

Другие вопросы по тегам