将 GitPython 配置为 output/log 命令并处理输出

Configure GitPython to output/log commands and process output

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

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

是否有某种方法可以将 GitPython 设置为 output/log 运行 命令,并显示它们产生的原始输出?

例如,上面的内容我希望是这样的:

$ 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 到 运行 命令。您可以修改 Popen 之前的 log.debug 行,或者只在适当的行插入 print(' '.join(cmd)) 。如果您使用的是 Python 3.3 或更新版本,您还可以参考 this answer 如何使用 subprocess.

打印命令

您还可以:

pull = self.repo.git.pull('--rebase')
log.info(pull)