我正在尝试使用 GitPython 访问耗时的 Git 操作的进度。我尝试了从官方文档中获取的示例解决方案,还尝试按照下面更新方法的确切签名传递一个方法。每次我打电话fetch()
, push()
, pull()
与参数progress=<anything>
,程序被卡住了,update
方法不会被调用。如果我在不设置 progress
的情况下调用这些操作参数,它完美地工作。
- 我使用
asserts
确保我的 repo 对象可用并处于预期状态 -
ProgressPrinter()
产量不None
- 我尝试从主线程和多线程调用函数
我查看了 implementation (line 350)的
RemoteProgress
还有 implementation (line 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。 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
关于python - 使用GitPython读取Git运行进度卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55993470/