阿捷外传之Git代码统计:DotNetCore + PowerBI 实现Git仓库日志分析

本文主要是介绍阿捷外传之Git代码统计:DotNetCore + PowerBI 实现Git仓库日志分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

2020年3月初春,虽然春节已经过去一个多月,大街上还未恢复往年的热闹。由于春节前夕突然降临的冠状病毒,导致很多员工无法回到城市复工。春节之后,阿捷所在的公司考虑到复工带来的风险,通知所有员工以远程的方式在家办公。

某一天,PM联系到阿捷,说目前有一个需求,想要对各个项目组的Git仓库提交信息进行相关统计,让阿捷调研一下。于是阿捷查了一番资料,了解到可以直接用原生 Git 命令行的方式来实现。

即使用内置的 git log 命令,提取仓库下的提交日志。

实践经过

git log 默认的输出格式是下面这个样子:

其中,上面的输出内容里主要包含了以下4种信息:

  • Commit 信息,每次提交的一个hash值;

  • Author 相关信息,提交的作者和及邮箱信息;

  • Commit Message, 提交时填写的信息,可能会包含多行文字。

Date 信息,这个信息中除了有日期时间,还包含时区信息。例如,从上图中可以看到有一条记录的日期为 Mon Mar 2 22:06:13 2020 -0800,其中最后的 -0800 就是所在的时区,即西八区,根据时区地图,可以看到 -0800是在美国西部湾区。中国处于东八区,所以如果是在中国提交的话,时区部分将会是 +0800 。

除了以上的4个基础信息,PM还想要拿到每次提交时变动的代码行数,阿捷通过查询Git Log 的命令行文档,了解到可以通过追加配置项 git log --shortstat 来输出变更的行数,如下图所示。

另外,git log 也考虑到输出格式化的问题,可以使用特殊的占位符指定输出格式。经过反复实验,优化后的命令如下:

git log --all --pretty="%x40%h%x2C%an%x2C%ad%x2C%x22%s%x22%x2C" --shortstat | tr "\n" " " | tr "@" "\n"

通过上面的魔幻配置,基本上能从每条提交记录中提取出需要的列,然后用逗号方式进行拼接,最终可以生成出CSV格式的文件。

然而这种方式始终不够优雅,命令中额外使用了 tr 对字符串进行处理,这意味着在目标机器上也要有这个工具,否则无法运行,而 windows 上只能通过安装第三方工具实现。

另外一点是扩展性问题,命令行对于csv这种简单的格式处理还好说,如果要输出JSON格式的话,就不好办了,而且命令行的配置项几乎没人能看懂,以后维护起来免不了要996。

基于上述痛点,阿捷又在网上搜寻了一番,最终在MVP大佬的一篇博客(https://edi.wang/post/2019/3/26/operate-git-with-net-core)中找到了蛛丝马迹。根据博客中的内容来看,可以通过一款名为libgit2sharp(https://github.com/libgit2/libgit2sharp)的类库,实现我们的需求。

libgit2sharp内部嵌套了一个基于C语言实现的Git内核,它自身对外提供一系列和Git操作相关的接口,并且它的上游核心仓库libgit2(https://github.com/libgit2/),提供了对包括Python,PHP,C#在内的多种语言的支持。而且项目是开源的,由社区进行维护。

阿捷经过简单上手,觉得提供的API可以满足需要,然后快速制作出了一个简易的命令行程序。核心代码如下:

using (var repo = new Repository(workdir))
{Console.WriteLine("all commit count:" + repo.Commits.Count());foreach (Commit commit in repo.Commits){var commitDto = new GitCommitLogDto{CommitHash = commit.Sha,AuthorName = commit.Author.Name,AuthorEmail = commit.Author.Email,MessageShort = commit.MessageShort,AuthorDate = commit.Author.When.DateTime,};var patch = GetPatchInfo(repo, commit);if (patch != null){commitDto.LinesAdded = patch.LinesAdded;commitDto.LinesDeleted = patch.LinesDeleted;};Console.WriteLine(commitDto.ToString());list.Add(commitDto);}
}

由于有了良好封装和结构化数据的支持,理论上可以将结果转化成任何格式,包括CSV,JSON,XML等,并且可以很方便地对数据格式进行任意加工。

考虑到工具在实际使用时,面临着跨平台和环境依赖的问题,于是阿捷使用了DoNetCore3.0提供的新特性,将程序打包成了不依赖安装环境的可执行文件,不需要安装外部依赖,开箱即用,最终打包的命令如下:

# publish win-x64
dotnet publish -c Release -o publish/win-x64 -r win-x64 /p:PublishSingleFile=true /p:IncludeSymbolsInSingleFile=true /p:PublishTrimmed=true#publish linux-x64
dotnet publish -c Release -o publish/linux-x64 -r linux-x64 /p:PublishSingleFile=true /p:IncludeSymbolsInSingleFile=true /p:PublishTrimmed=true

然后因为是开源项目,可以用GitHub的高性能构建机器,阿捷使用了yml文件为项目制作了自动构建的流水线,每次提交代码后自动触发编译生成出新的二进制文件。

除了CSV文件的部分,PM那还需要制作出相关报表,对CSV中的数据进行统计。阿捷考察了目前市面上流行的BI工具,最终选择了免费的PowerBI桌面版(https://powerbi.microsoft.com/zh-cn/)。

PowerBI是由微软出品的一款专业的用于商业智能方向的报表工具,桌面版内嵌了一套高性能的计算引擎,不需要安装任何依赖,开箱即用。而且支持的数据源种类非常多,CSV文件完全不在话下。

阿捷首先用吃狗粮的态度,用自己制作的命令行工具,从AspNetCore(https://github.com/dotnet/aspnetcore)的官方Github仓库中提取出了共计4万多提交信息,数据如下:

然后,阿捷经过对PowerBI简单的上手,制作出了下面几张报表。

上图中可以看到AspNetCore中仓库提交记录是最早从2013年开始的。

上图中,可以看到2017和2018年是提交次数和增加行数最多的一年,参考aspnetcore的发布时间,可以知道这期间经历了从1.1到2.0和2.2之间的迭代。

上面两张图展示了根据提交者的邮箱后缀,对提交次数和增加行数的统计。可以看出,来自微软员工的提交占了相当的分量,并且来自外部的贡献者也很广泛,说明AspNetCore有着广泛的社区贡献者。

上述两种图展示 的提交的日期主要分布在周一到周五之间的工作日,在提交的时间分布上,主要集中在上午10点到下午5点之间。

后记

有了DotNetCore和PowerBI的助力,阿捷很轻松地搞定了PM的需求,为了发扬回馈社区的精神,阿捷将项目托管在了GitHub上,仓库链接:https://github.com/leansoftX/dotnet-gitstats。有需要的小伙伴可以直接拿来食用。目前项目还在早期阶段,欢迎动手能力强的小伙伴增加新功能,提交ISSUE或PR。

参考资源

  • Git Log 命令行文档(https://git-scm.com/docs/git-log)

  • libgit2sharp上手博客(https://edi.wang/post/2019/3/26/operate-git-with-net-core)

  • libgit2sharp 上手wiki(https://github.com/libgit2/libgit2sharp/wiki/git-log)

  • PowerBI下载地址(https://www.microsoft.com/en-us/download/details.aspx?id=58494)

本周二(今天)晚8点,Boat House共创迭代会议直播????

这篇关于阿捷外传之Git代码统计:DotNetCore + PowerBI 实现Git仓库日志分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/355368

相关文章

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

使用WPF实现窗口抖动动画效果

《使用WPF实现窗口抖动动画效果》在用户界面设计中,适当的动画反馈可以提升用户体验,尤其是在错误提示、操作失败等场景下,窗口抖动作为一种常见且直观的视觉反馈方式,常用于提醒用户注意当前状态,本文将详细... 目录前言实现思路概述核心代码实现1、 获取目标窗口2、初始化基础位置值3、创建抖动动画4、动画完成后

uniapp小程序中实现无缝衔接滚动效果代码示例

《uniapp小程序中实现无缝衔接滚动效果代码示例》:本文主要介绍uniapp小程序中实现无缝衔接滚动效果的相关资料,该方法可以实现滚动内容中字的不同的颜色更改,并且可以根据需要进行艺术化更改和自... 组件滚动通知只能实现简单的滚动效果,不能实现滚动内容中的字进行不同颜色的更改,下面实现一个无缝衔接的滚动

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

利用Python实现可回滚方案的示例代码

《利用Python实现可回滚方案的示例代码》很多项目翻车不是因为不会做,而是走错了方向却没法回头,技术选型失败的风险我们都清楚,但真正能提前规划“回滚方案”的人不多,本文从实际项目出发,教你如何用Py... 目录描述题解答案(核心思路)题解代码分析第一步:抽象缓存接口第二步:实现两个版本第三步:根据 Fea

Go语言使用slices包轻松实现排序功能

《Go语言使用slices包轻松实现排序功能》在Go语言开发中,对数据进行排序是常见的需求,Go1.18版本引入的slices包提供了简洁高效的排序解决方案,支持内置类型和用户自定义类型的排序操作,本... 目录一、内置类型排序:字符串与整数的应用1. 字符串切片排序2. 整数切片排序二、检查切片排序状态:

python利用backoff实现异常自动重试详解

《python利用backoff实现异常自动重试详解》backoff是一个用于实现重试机制的Python库,通过指数退避或其他策略自动重试失败的操作,下面小编就来和大家详细讲讲如何利用backoff实... 目录1. backoff 库简介2. on_exception 装饰器的原理2.1 核心逻辑2.2

Java计算经纬度距离的示例代码

《Java计算经纬度距离的示例代码》在Java中计算两个经纬度之间的距离,可以使用多种方法(代码示例均返回米为单位),文中整理了常用的5种方法,感兴趣的小伙伴可以了解一下... 目录1. Haversine公式(中等精度,推荐通用场景)2. 球面余弦定理(简单但精度较低)3. Vincenty公式(高精度,

QT6中绘制UI的两种方法详解与示例代码

《QT6中绘制UI的两种方法详解与示例代码》Qt6提供了两种主要的UI绘制技术:​​QML(QtMeta-ObjectLanguage)​​和​​C++Widgets​​,这两种技术各有优势,适用于不... 目录一、QML 技术详解1.1 QML 简介1.2 QML 的核心概念1.3 QML 示例:简单按钮

Java实现视频格式转换的完整指南

《Java实现视频格式转换的完整指南》在Java中实现视频格式的转换,通常需要借助第三方工具或库,因为视频的编解码操作复杂且性能需求较高,以下是实现视频格式转换的常用方法和步骤,需要的朋友可以参考下... 目录核心思路方法一:通过调用 FFmpeg 命令步骤示例代码说明优点方法二:使用 Jaffree(FF