在GitPython中迭代提交b / w 2个指定的提交

时间:2019-03-15 06:10:38

标签: python git loops commit gitpython

import git
repo = git.Repo(repo_dir)
ref_name = 'master'
for commit in repo.iter_commits(rev=ref_name):
     <some code here>

此代码遍历所有提交。我想迭代b / w 2次提交。 就像git log commit1...commit2

如何使用GitPython的iter_commits()方法执行同样的操作。

4 个答案:

答案 0 :(得分:2)

您可以为此使用纯gitpython。

如果您希望能够遍历某些提交(假设第一个提交 commit为HEAD),只需使用max_count。参见The Commit object

two_commits = list(repo.iter_commits('master', max_count=2))
assert len(two_commits) == 2

如果您希望获得与git log commit1...commit2类似的功能,

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'

您还可以使用logs = repo.git.log("f5035ce..f63d26b"),但是它将为您提供所有信息(就像您在不使用git log的情况下使用--oneline

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

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')

有关repo.git.log的更多说明,请参见https://stackoverflow.com/a/55545500/6000005

答案 1 :(得分:2)

repo.iter_commits(rev='1234abc..5678def')GitPython==2.1.11中为我工作

示例:

repo = git.Repo(repo_dir)
for commit in repo.iter_commits(rev='master..HEAD'):
     <some code here>

答案 2 :(得分:1)

我建议您使用PyDriller(GitPython的包装器,使事情变得更容易)。您的要求可以这样完成:

for commit in RepositoryMining("path_to_repo", from_commit="first", to_commit="second").traverse_commits():
    # your code

答案 3 :(得分:-1)

首先,使函数运行git命令。

from git import *
from subprocess import Popen, PIPE

def execute_gitcmd(cmd, repo):
    pipe = subprocess.Popen(cmd, shell=True, cwd=repo, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    (out, error) = pipe.communicate()
    return out, error
    pipe.wait()

然后编写您在终端上使用的任何git命令,例如:

gitcmd = "git log -n1 --oneline"

最后,调用您的函数:

log = (execute_gitcmd(gitcmd, your_repository))

希望这会有所帮助。