问题描述
我正在使用 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
打印命令。