配置 GitPython 以输出/记录命令并处理输出

问题描述

我正在使用 gitpython 对 repos 运行几个简单的命令。基本上大部分只是:

repo = Repo(repo_dir)
repo.git.fetch()
result = repo.git.diff("origin",name_only=True)
repo.git.merge()
# ...

有没有办法设置 gitpython输出/记录运行的命令,并显示它们产生的原始输出

例如,我希望上面的内容类似于:

$ git fetch
$ git diff --name-only origin
path/to/differing_file
path/to/another/differing_file
$ git merge

解决方法

GitPython 使用模块 logging。通过在代码前添加 logging.basicConfig(level=logging.DEBUG),它会打印类似

的日志
DEBUG:git.cmd:Popen(['git','fetch'],cwd=E:\path\foo,universal_newlines=False,shell=None)

如果您希望它按预期打印格式化日志,您可以修改 GitPython 的源代码。我使用的是 Python 2.7,我的 GitPython 安装在 C:\Python27\lib\site-packages\git。您可以在 REPL 中运行 git.__file__ 来查找您的安装目录。在文件 C:\Python27\lib\site-packages\git\cmd.py 中,您可以找到方法 def execute。它调用 subprocess.Popen 来运行命令。您可以在 log.debug 之前修改行 Popen 或只是在适当的行插入 print(' '.join(cmd))。如果您使用的是 Python 3.3 或更新版本,您还可以参考 this answer 如何使用 subprocess 打印命令。