我正在尝试在我的脚本中使用 GitPython 模块......但我不能。这不是很有记录:GitPython Blame

我想我还没有那么远,因为我想要重现的通常 git 责备是以下内容:git blame -L127,+1 ../../core/src/filepath.cpp -e
这是我的脚本:

from git import *
    repo = Repo("C:\\Path\\to\\my\\repos\\")
    assert not repo.bare
    # log_line = open("lineDeb.txt")
    # for line in log_line:
    repo.git.blame(L='127,+1' '../../core/src/filepath.cpp', e=True)

注释的两行是为了在我的“lineDeb.txt”文件中的每个数字行上进行 git blame 的最终目标。

我有以下输出:
...
git.exc.GitCommandError: 'git blame -L127,+1../../core/src/filepath.cpp -e' returned with exit code 129
stderr: 'usage: git blame [options] [rev-opts] [rev] [--] file
...

我知道我可以用 os 模块制作它,但我想保留在 python 中。

如果这个模块或 python 的专家可以帮助我吗?

也许我没有正确使用 GitPython?

目标是获取行提交者的电子邮件......

提前致谢。

最佳答案

for commit, lines in repo.blame('HEAD', filepath):
    print("%s changed these lines: %s" % (commit, lines))
commit 是按照文件中出现的顺序更改给定 lines 的那个。因此,如果您将所有 lines 写入文件,您将在 filepath 的修订版中拥有该文件 HEAD

如果您只查找特定行,并且由于当前没有可以传递给 blame 子命令的选项,则您必须自己计算该行。
ln = 127 # lines start at 0 here
tlc = 0

for commit, lines in repo.blame('HEAD', filepath):
    if tlc <= ln < (tlc + len(lines)):
         print(commit)
    tlc += len(lines)

这不如将相应的 -L 选项传递给 git blame 最佳,但应该可以完成这项工作。

如果结果太慢,您可以考虑制作一个 PR,将 **kwargs 添加到 Repo.blame 以传递给 git blame

关于python - 如何在 GitPython 中使用 git blame ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28940734/

10-13 09:33