Как получить с помощью 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() не обновляет ссылки, он просто выбирает объекты, а затем возвращает удаленные ссылки, чтобы вы могли использовать их для обновления ссылок целевого репозитория.