如何在GitPython中使用git blame?

时间:2015-03-09 11:19:56

标签: python gitpython

我试图在我的脚本中使用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.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?

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

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更合理,但应该完成这项工作。

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

答案 1 :(得分:0)

如果您指责大量的线路,您可能会发现这种更高的性能:

blame = []
cmd = 'cd {path};git blame {fname}'.format(
            path=repo_path,
            fname=rootpath + fname)
with os.popen(cmd) as process:
   blame = process.readlines()

print blame[line_number]