python - 使用GitPython读取Git运行进度卡住

标签 python git python-3.7 gitpython

我正在尝试使用 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。 RemoteProgressupdate() 方法未被调用

如果您的 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/

相关文章:

python - 如何从 JSON 多维附加动态下拉列表

python - 在 Python 中使用 libclang 在 C++ 中进行解析

python - 如何创建可以向类添加多个方法的类装饰器?

python - 带有 View 集路由器查询集过滤的 Django REST 框架

python - 使用 python mysql 连接器时如何使用变量作为属性名称

java - JGit 克隆并获取修订散列

python - 使用 Array<Map<String,String>> 列读取 Parquet 文件

git - 在没有 pull 请求的情况下直接提交和同步?

linux - git 错误与 git 已知的任何文件都不匹配

anaconda - rstudio中网状结构出现故障