Это пример кода из одного из моих старых проектов (не открытый, поэтому нет ссылок на репозиторий):
def parse_commit_log(repo, *params):
commit = {}
try:
log = repo.git.log(*params).split("\n")
except git.GitCommandError:
return
for line in log:
if line.startswith(" "):
if not 'message' in commit:
commit['message'] = ""
else:
commit['message'] += "\n"
commit['message'] += line[4:]
elif line:
if 'message' in commit:
yield commit
commit = {}
else:
field, value = line.split(None, 1)
commit[field.strip(":")] = value
if commit:
yield commit
Пояснение:
Функция ожидает экземпляр Repo
и те же параметры, которые вы передадите команде git log
. Итак, использование в вашем случае может выглядеть так:
repo = git.Repo('project_path')
commits = list(parse_commit_log(repo, 'module_dir'))
Внутренне repo.git.log
вызывает команду git log
. Его вывод выглядит примерно так:
commit <commit1 sha>
Author: User <username@email.tld>
Date: Sun Apr 7 17:08:31 2019 -0400
Commit1 message
commit <commit2 sha>
Author: User2 <username2@email.tld>
Date: Sun Apr 7 17:08:31 2019 -0400
Commit2 message
parse_commit_log
анализирует этот вывод и выдает сообщения о фиксации. Вам нужно добавить еще несколько строк, чтобы получить коммит sha, автора и дату, но это не должно быть слишком сложно.