Прогресс чтения операции Git с использованием GitPython - PullRequest
3 голосов
/ 05 мая 2019

Я пытаюсь получить доступ к прогрессу трудоемких операций Git с помощью GitPython. Я попробовал пример решения, взятый из официальной документации, а также попытался передать метод, следуя точной подписи метода обновления ниже. Каждый раз, когда я вызываю fetch(), push(), pull() с параметром progress=<anything>, программа застревает, а метод update не вызывается. Если я вызываю эти операции без установки параметра progress, он работает безупречно.

  • Я использую asserts, чтобы убедиться, что мои объекты репо доступны и находятся в ожидаемом состоянии
  • ProgressPrinter() не дает None
  • Я пытался вызывать функции из основного потока и многопоточных
  • Я посмотрел на реализацию (строка 350) из RemoteProgress, а также реализацию (строка 815) из push() и не вижу причина, по которой не будет продолжено исполнение

  • Я обнаружил, что когда я присваиваю свой экземпляр ProgressPrinter и передаю назначенную переменную, программа больше не застревает. Тем не менее, метод update() не вызывается, и никакого прогресса не печатается

# Not stuck anymore, yet no progress
pp = ProgressPrinter()
fetch_info = origin.fetch(progress=pp)

Ядро моей реализации:

from git import RemoteProgress

class ProgressPrinter(RemoteProgress):
    def update(self,
               op_code,
               cur_count,
               max_count=None,
               message=''):
        print("Is this even called?")

И позже:

origin = repo.remotes.origin
assert origin.exists()
fetch_info = origin.fetch(progress=ProgressPrinter())

Есть какие-нибудь рекомендации по дальнейшему расследованию этой проблемы? Я отлаживал это уже один день и чувствую, что что-то упустил.

1 Ответ

2 голосов
/ 06 мая 2019

1.GitPython зависает при обработке информации о прогрессе

За последние пару месяцев в Git были внесены изменения в локализацию.Понижение уровня моего Git с 2.21.0 до 2.20.4 решило эту проблему на данный момент.Не элегантное решение, но разработчики GitPython знают об изменениях.

Посмотрите на проблему и посмотрите, решена ли она: (Github Issue # 871)

2.RemoteProgress update() метод не вызывается

Если ваш процесс Git завершается быстро, этот метод вообще не будет вызываться.Чтобы смоделировать более длительный процесс, я предлагаю вам клонировать большой репозиторий из Github / Gitlab и подготовить его следующим образом:

$ git reset --hard @~100
$ git remote remove origin
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
$ git remote add origin <url>

Я предложил изменить метод update() таким образом, чтобы он такжевызывается один раз , когда операция заканчивается = [up to date]: PullRequest

...