使用Pydriller提取GIT存储库数据
#python #git #data #datavisualization

在2022年初,我首次发布了一个名为“可视化代码”的演讲,该演讲使用数据可视化来探索开源项目中的模式。本文是新系列中的第一本,它可以引导您了解如何发现和分析自己的存储库中的模式。

具体来说,本文将介绍如何在GitHub上使用任何公共存储库,并提取包含提交历史记录信息的CSV文件。一旦获得数据文件,分析此数据集的过程非常灵活,并且可以通过多种方式完成,包括Python Code,Tableau,Power BI,甚至Excel。

本文介绍的代码假定您已安装了pydrillerpandas。本文内容需要Pydriller,而PANDAS只是有助于可视化加载数据并将其导出到CSV文件。有关入门的更多信息,请参见installing PyDriller,但通常需要pip install pydriller

什么是Pydriller?

PyDriller是一个open-source python库,可让您“钻入” git存储库。

根据其GitHub存储库,“ Pydriller是一个Python框架,可帮助开发人员分析GIT存储库。使用Pydriller,您可以轻松提取有关提交,开发人员,修改的文件,差异和源代码的信息。 em>。

使用Pydriller,我们将能够从任何公共GitHub存储库中提取信息,包括:

  • 个人提交
  • 提交作者
  • 提交日期,时间和时区
  • 每个提交修改的文件
  • 添加和删除的行数
  • 相关提交
  • 代码复杂性指标

让我们看一下它的工作原理

连接到存储库

为了从存储库中获取信息,我们必须首先从给定的github url创建一个Repository对象。

这很简单的代码:

# We need PyDriller to pull git repository information
from pydriller import Repository

# Replace this path with your own repository of interest
path = 'https://github.com/dotnet/machinelearning'
repo = Repository(path)

此代码实际上并未分析 它使我们进入了一个可以穿越GIT存储库一部分的提交的状态。

我们实际上通过在我们的Repository对象上调用traverse_commits()并循环结果来检查这些提交。

重要说明:在存储库提交上循环需要很长时间的大型存储库。分析the ML.NET repository的时间为52分钟,该代码示例指的是,该示例在2023年2月25日进行分析时有2,681个提交。

下面的代码将在所有提交和每个提交中循环:

  • 构建该提交修改的文件列表
  • 提取基本提交信息
  • 使用Pydriller的开源Delta可维护性模型(OS-DMM)计算代码指标

在读取每个提交时,将其添加到作为加载过程的最终副产品的提交列表中。

代码列表如下:

# Loop over each PyDriller commit to transform it to a commit usable for analysis later
# NOTE: This can take a LONG time if there are many commits

commits = []
for commit in repo.traverse_commits():

    hash = commit.hash

    # Gather a list of files modified in the commit
    files = []
    try:
        for f in commit.modified_files:
            if f.new_path is not None:
                files.append(f.new_path) 
    except Exception:
        print('Could not read files for commit ' + hash)
        continue

    # Capture information about the commit in object format so I can reference it later
    record = {
        'hash': hash,
        'message': commit.msg,
        'author_name': commit.author.name,
        'author_email': commit.author.email,
        'author_date': commit.author_date,
        'author_tz': commit.author_timezone,
        'committer_name': commit.committer.name,
        'committer_email': commit.committer.email,
        'committer_date': commit.committer_date,
        'committer_tz': commit.committer_timezone,
        'in_main': commit.in_main_branch,
        'is_merge': commit.merge,
        'num_deletes': commit.deletions,
        'num_inserts': commit.insertions,
        'net_lines': commit.insertions - commit.deletions,
        'num_files': commit.files,
        'branches': ', '.join(commit.branches), # Comma separated list of branches the commit is found in
        'files': ', '.join(files), # Comma separated list of files the commit modifies
        'parents': ', '.join(commit.parents), # Comma separated list of parents
        # PyDriller Open Source Delta Maintainability Model (OS-DMM) stat. See https://pydriller.readthedocs.io/en/latest/deltamaintainability.html for metric definitions
        'dmm_unit_size': commit.dmm_unit_size,
        'dmm_unit_complexity': commit.dmm_unit_complexity,
        'dmm_unit_interfacing': commit.dmm_unit_interfacing,
    }
    # Omitted: modified_files (list), project_path, project_name
    commits.append(record)

您会注意到上面的代码在try / except中。这是因为Github意外地对Pydriller提出的提交详细信息做出了反应。知道这是一个有效的存储库,我认为最好的策略是记录通过提交哈希发生的错误,并将这些提交排除在最终结果集中。

验证加载过程

加载数据后(可能需要一些时间),该确保它看起来有效。

我选择通过使用流行的Pandas library进行表格数据分析任务来做到这一点。

虽然PANDA通常用于分析,筛选,清洁和以其他方式操纵表格数据源,但我们在项目的此阶段的使用是相当基本的:将数据加载到表格数据框中,并显示其小型预览,然后将其保存到磁盘。

加载和预览数据集的代码如下:

import pandas as pd

# Translate this list of commits to a Pandas data frame
df_commits = pd.DataFrame(commits)

# Display the first 5 rows of the DataFrame
df_commits.head()

如果在Jupyter Notebook中运行,则最终行的df_commits.head()呼叫将显示以下结果:

Pandas DataFrame

重要说明:通过.head()调用显示数据框的前5行,只有在作为jupyter笔记本的一部分执行此代码时,才能使用,而该行是代码单元格中的最后一行。但是,此步骤是可选的,因为它的唯一目的是让您窥视输出。

将数据导出到CSV文件

最后,您可以将数据框的内容保存在CSV文件中,并具有以下代码:

df_commits.to_csv('Commits.csv')

这将把文件保存到名称为Commits.csv的当前目录中的磁盘。

将文件写入磁盘后,您可以将其导入Excel,Tableau,Power BI或其他数据分析工具。

另外,您可以在未来的文章中探索的Python代码再次加载它并用Python代码进行可视化。

限制和下一步

我在这里提供的代码对于从GitHub上的公共存储库中生成CSV文件很有用。

,如果您想通过进一步的手动数据分析或将数据插入数据可视化工具来可视化提交历史记录中的趋势。

但是,此过程确实有一些限制:

首先,它不适用于GitHub上的非公共存储库或Github上的Git存储库。

其次,我观察到,我试图解释的2,681个提交中有10个具有某种形式的持续错误,可以通过Pydriller从Github检索他们的数据。我只在一个存储库上看到了这个问题,但是您可以在自己的存储库中遇到它。

第三,此过程需要大量时间来处理存储库历史记录。在我的实验中,我看到了处理约1毫秒约1毫秒的处理的性能,这意味着大多数存储库将花费大量的时间来处理。

最后,此过程仅跟踪有关GIT更改的高级信息,并且不包含有关其包含的单个行或代码更改的详细信息,尽管应包括修改文件。


所有人都告诉我们,Pydriller是一个很好的实用程序,可以轻松获取GIT存储库数据并准备进一步分析。

请继续关注将来的文章,展示如何使用该git存储库的数据。