Итерация коммитов ч / б 2 указанных коммитов в GitPython - PullRequest
1 голос
/ 15 марта 2019
import git
repo = git.Repo(repo_dir)
ref_name = 'master'
for commit in repo.iter_commits(rev=ref_name):
     <some code here>

Этот код повторяет все коммиты. Я хочу повторить ч / б 2 коммитов. Так же, как git log commit1...commit2

Как я могу сделать то же самое, используя метод iter_commits () GitPython.

Ответы [ 3 ]

2 голосов
/ 07 апреля 2019

Вы можете использовать для этого чистый gitpython.

Если вы хотите пройти через определенный коммит (предполагая, что первый commit is HEAD), просто используйте max_count. См. Объект Commit

.
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 голос
/ 01 апреля 2019

Я бы предложил вам использовать PyDriller (обертка вокруг GitPython, чтобы упростить задачу).То, что вы спросили, можно сделать так:

for commit in RepositoryMining("path_to_repo", from_commit="first", to_commit="second").traverse_commits():
    # your code
0 голосов
/ 15 марта 2019

Сначала создайте функцию для запуска команды 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))

Надеюсь, это поможет.

...