如何在 gitpython 中使用 git log --oneline

How to use git log --oneline in gitpython

我正在尝试通过提供开始 sha 和结束 sha 来提取提交消息列表。 git 使用 git 日志很容易。 但我正在尝试通过 gitpython 库来完成。 有人可以帮我实现这个目标吗?

在Git中的命令是这样的:

git log --oneline d3513dbb9f5..598d268f

我如何使用 gitpython 来实现?

您可能想尝试 PyDriller(GitPython 的包装器),它更容易:

for commit in Repository("path_to_repo", from_commit="STARTING COMMIT", to_commit="ENDING_COMMIT").traverse_commits():
    print(commit.msg)

如果要提交特定分支,请添加参数only_in_branch="BRANCH_NAME"。文档:http://pydriller.readthedocs.io/en/latest/

你可以使用纯 gitpython:

import git
repo = git.Repo("/home/user/.emacs.d") # my .emacs repo just for example
logs = repo.git.log("--oneline", "f5035ce..f63d26b")

会给你:

>>> logs
'f63d26b Fix urxvt name to match debian repo\n571f449 Add more key for helm-org-rifle\nbea2697 Drop bm package'

如果你想要漂亮的输出,使用漂亮的打印:

from pprint import pprint as pp
>>> pp(logs)
('f63d26b Fix urxvt name to match debian repo\n'
 '571f449 Add more key for helm-org-rifle\n'
 'bea2697 Drop bm package')

注意 logsstr 如果你想把它变成一个列表,就 使用 logs.splitlines()

Gitpython 几乎所有类似 API 和 git。例如 repo.git.log 对应 git logrepo.git.show 对应 git show。在 Gitpython API Reference

中了解更多信息

GitPython Repo.iter_commits() function (docs) has support for ref-parse-style commit ranges。所以你可以这样做:

import git
repo = git.Repo("/path/to/your/repo")
commits = repo.iter_commits("d3513dbb9f5..598d268f")

之后的一切都取决于您想要获得的确切格式。如果你想要类似于 git log --oneline 的东西,那就可以了(这是一种简化形式,tag/branch 名称未显示):

for commit in commits:
    print("%s %s" % (commit.hexsha, commit.message.splitlines()[0]))