使用gitpython解析git日志

使用gitpython解析git日志,python,git,git-log,gitpython,Python,Git,Git Log,Gitpython,在python中,我希望获取git存储库中文件的所有提交日志,并解析日志中的信息(散列、作者姓名、作者邮件、作者日期、提交者姓名、提交者邮件、提交日期和提交消息)。目前,我可以使用gitpython或通过子流程调用shell命令获取原始git日志 使用gitpython: g=git.Git(path) loginfo=g.log("--pretty=fuller",'--follow',"<filename>") g=git.git(路径) loginfo=g.log(“--pr

在python中,我希望获取git存储库中文件的所有提交日志,并解析日志中的信息(散列、作者姓名、作者邮件、作者日期、提交者姓名、提交者邮件、提交日期和提交消息)。目前,我可以使用gitpython或通过子流程调用shell命令获取原始git日志

使用gitpython:

g=git.Git(path)
loginfo=g.log("--pretty=fuller",'--follow',"<filename>")
g=git.git(路径)
loginfo=g.log(“--pretty=fuller”、“--follow”、”)
使用SubAccess调用:

lines = subprocess.check_output(
        ['git', 'log','--follow',"--pretty=fuller"," 
         <filename"],stderr=subprocess.STDOUT)
lines=subprocess.check\u输出(
['git'、'log'、'--follow'、“--pretty=fuller”

您可以使用以下方法获取所有存储库提交:

导入git
repo=git.repo(“/home/user/.emacs.d”)
提交=列表(repo.iter\u提交(“主”,最大计数=5))
然后,您可以确定gitpython提供了什么样的数据:

dir(提交[0])
其中包括:

  • 作者
  • 承诺日期时间
  • 河沙
  • 信息
  • 统计数据
例如:

>提交[0]。作者
>>>提交[0]。hexsha
“FE4326E94ECA2E651BF0081BEE0172FEDAF0B90”
>>>提交[0]。消息
'添加ocaml模式\n'
>>>提交[0]。提交的\u日期时间
datetime.datetime(1970,1,1,0,0,0,tzinfo=)
(committed_datetime输出带有区域设置对象的datetime对象)

如果要检查提交是否包含文件(如果 您想从该文件中获取所有提交)。您可以使用:

def是否存在(文件名,sha):
“”“检查当前提交中是否存在文件。”“”
files=repo.git.show(“--pretty=”,“--name only”,sha)
如果文件中有文件名:
返回真值
然后,要从文件中获取所有提交,请执行以下操作:

def get_file_提交(文件名):
文件提交=[]
对于提交中的提交:
如果存在is_(文件名,commit.hexsha):
文件_commits.append(提交)
返回文件\u提交
e、 g我想从'init.el'文件中获取所有提交:

initel\u file\u commits=get\u file\u commits('init.el'))
>>>初始化文件提交
[, ]
确保功能正常工作:

>>初始化文件提交[0]。stats.files
{'init.el':{'insertions':1,'deletions':0,'lines':1},'modules/aza ocaml.el':{'insertions':28,'deletions':0,'lines':28}
>>>初始化文件提交[1]。stats.files
{'init.el':{'insertions':1,'deletions':0,'lines':1},'modules/aza calfw.el':{'insertions':65,'deletions':0,'lines':65},'modules/aza home.el':{'insertions':0,'deletions':57,'lines':57}

希望它有帮助。

可以考虑使用,这是围绕GITPython的包装器,使这些事情更容易。有一个函数叫做“代码> GETyPrimsS.MuffiDeFiffe())< /> >:

然后你可以做:

for commit in RepositoryMining("repo_path", only_commits=commits).traverse_commits():
    # your code here
for commit in RepositoryMining("repo_path", only_commits=commits).traverse_commits():
    # your code here