使用 GitPython 卡住的 Git 操作的读取进度
Reading progress of Git operation using GitPython stuck
我正在尝试使用 GitPython 访问耗时 Git 操作的进度。我尝试了从官方文档中获取的示例解决方案,还尝试按照下面更新方法的确切签名传递一个方法。每次我调用 fetch()
、push()
、pull()
和 参数 progress=<anything>
时,程序卡住并且 update
方法不会被调用。如果我在不设置 progress
参数的情况下调用这些操作,它会完美运行。
- 我使用
asserts
来确保我的回购对象可用并处于预期状态
ProgressPrinter()
不产生 None
- 我尝试从主线程和多线程调用函数
我查看了 push()
的 implementation (line 350) of RemoteProgress
and also the implementation (line 815) 并没有看到为什么它不会继续执行的原因
我发现,当我分配 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. 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
我正在尝试使用 GitPython 访问耗时 Git 操作的进度。我尝试了从官方文档中获取的示例解决方案,还尝试按照下面更新方法的确切签名传递一个方法。每次我调用 fetch()
、push()
、pull()
和 参数 progress=<anything>
时,程序卡住并且 update
方法不会被调用。如果我在不设置 progress
参数的情况下调用这些操作,它会完美运行。
- 我使用
asserts
来确保我的回购对象可用并处于预期状态 ProgressPrinter()
不产生None
- 我尝试从主线程和多线程调用函数
我查看了
push()
的 implementation (line 350) ofRemoteProgress
and also the implementation (line 815) 并没有看到为什么它不会继续执行的原因我发现,当我分配
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. 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