python - 使用 GitPython 读取 Git 操作的进度卡住了
问题描述
我正在尝试使用 GitPython 访问耗时的 Git 操作的进度。我尝试了从官方文档中获取的示例解决方案,还尝试按照下面更新方法的确切签名传入一个方法。每次我用参数调用fetch()
,时push()
,程序都会卡住,并且不会调用该方法。如果我在不设置参数的情况下调用这些操作,它会完美运行。pull()
progress=<anything>
update
progress
- 我
asserts
用来确保我的 repo 对象可用并处于预期状态 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、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
推荐阅读
- liferay-7 - 全新安装 Liferay 时登录失败
- python-3.x - 自添加打印以来的 RPLY 无效令牌错误
- android - 从图库中选择图像时如何避免关闭弹出窗口?
- javascript - 如何避免 UI5 中的“主线程上的同步 XMLHttpRequest”警告?
- ruby - 如何找到给定输入值以下的所有素数?
- ios - iOS transform3D,两个视图X轴旋转,改变视图层次,为什么?
- laravel - Laradock 上的 Spatie Laravel 备份无法打开目录容器数据/mysql/#innodb_temp 权限被拒绝
- javascript - 呈现数字数组的 React 组件的不同背景颜色
- javascript - 如何将 Javascript 鼠标悬停 css 效果应用于具有相同类名的所有元素?
- python - 托管在heroku上时如何让fibit python工作?