如何在Python中正确解析Git命令(`git log ...`)?

3
使用Python脚本,我想要获取最后一次提交更改至特定文件的人的电子邮件地址。
听起来很容易,对吧?我只需要以某种方式解析以下内容即可。
git log -n 1 --pretty=format:%ae -- /path/to/file.py

sh是我首选的选择。但不幸的是,在Python中,

import sh
print(str(sh.git.log('-n 1 --pretty=format:%ae -- /path/to/file.py')))
print(str(sh.git.log('-n', '1', '--pretty=format:%ae', '--', /path/to/file.py')))

同时按下 - (按回车键) 即可打印。也许我在参数方面搞错了什么。

另外,str(sh.git.status()) 正确返回 On branch master ...,其他一些经过测试的命令也如预期般正常工作。

该如何解决这个问题呢?


尝试使用 blame git 命令。 - voltento
@voltento 请仔细阅读问题。我知道git的工作命令,但我在Python中解析它时遇到了麻烦。 - Pranasas
1
您选择的标题有些误导。这个问题与Git关系不大,因为正如您所说,获取最后提交的电子邮件地址的Git命令很好用。您只是在使用Python时遇到了一些麻烦。我建议您将问题重点转移到实际问题上,并进行精炼。 - anothernode
1
@anothernode 感谢您的建议,我已将问题重命名以更好地反映出解析问题。 - Pranasas
2个回答

3

- (按回车键) 输出的声音听起来像是由寻呼机打印出来的。

记住,每个 Git 命令都可能(取决于选项、参数、配置设置以及其他环境细节,如 stdin 是否为 tty)将其输出通过分页器运行。使用的分页器取决于您的个人配置。该分页器的行为取决于所使用的分页器和输入数据。

一个简单的解决方法是运行 git --no-pager <git-command> 来告诉 Git 即使配置和环境建议使用分页器,也不要使用分页器。


这正是我所需要的。代码在多台机器上运行,而且我个人甚至不需要为它们进行配置。 - Pranasas

2
这应该可以正常工作:
print(str(sh.git.log("-n 1", "--pretty=format:%ae", "/path/to/file")))

至少这展示了在我的机器上它是如何工作的:

$ git log -n 1 --pretty=format:%ae -- README.md
foo@bar.com
$ python3
Python 3.6.4 (default, Jan 25 2018, 15:54:40)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sh
>>> print(str(sh.git.log("-n 1", "--pretty=format:%ae", "README.md")))
foo@bar.com

为什么它应该工作?无论如何,它仍然是相同的“-(按回车键)”。 - Pranasas
1
你确定你在调用 sh.git.log() 时,参数的输入方式和我这里展示的完全一致吗?因为在你提出问题的代码中,输入方式与此不同。 - anothernode
1
感谢您的帮助。在另一台机器上,它也起作用了。为了让它在任何地方都能工作,我不得不添加 --no-pager - Pranasas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接