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()方法执行同样的操作。
答案 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))
希望这会有所帮助。