Git Python 使用 grep 登录

Git Python log with grep

命令行我是运行

git log \
    --merges \
    --grep='^Merge pull request .* in repo/foo from' \
    --grep='^Merged .* to master' \
    tag1..tag2

这为我提供了两个给定标签之间要掌握的合并提交列表。

现在我正在努力从 GitPython 获得相同的东西。

到目前为止我尝试过的:

git.Git(os.getcwd()).log(
    '--merges',
    '--grep="^Merge pull request .* in repo/foo from"',
    '--grep="^Merged .* to master"',
    'tag1..tag2')

这仅在我删除 grep 行时有效。使用 grep 它 returns 一个空字符串。此处行为相同:

git.Git(os.getcwd()).execute(['git', 'log',
    '--merges',
    '--grep="^Merge pull request .* in repo/foo from"',
    '--grep="^Merged .* to master"',
    'tag1..tag2'])

我试过的另一件事:

git.repo.fun.rev_parse(repo=git.Repo(), rev='tag1..tag2')

此错误与 BadName 相关,因为 tag1..tag2 未解析为对象。

找到答案了。这是关于糟糕的报价。这有效:

git.Git(os.getcwd()).log(
    '--merges',
    '--grep=^Merge pull request .* in repo/foo from',
    '--grep=^Merged .* to master',
    'tag1..tag2')

我认为引号在命令行上是必要的,以便将参数保持在一起,但是在 Python 中传递参数时,每个参数都是一个字符串,因此已经 "quoted".

shell 需要引号以防止其解释字符串中的元字符;但是在这里,你没有 shell.

git.Git(os.getcwd()).execute(['git', 'log',
    '--merges',
    '--grep=^Merge pull request .* in repo/foo from',
    '--grep=^Merged .* to master',
    'tag1..tag2'])

我猜你也可以用 '.'.

替换 os.getcwd()