GitLab统计代码量
gitlab官方文档:https://docs.gitlab.com/ee/api/index.html
1、生成密钥
登录gitlab,编辑个人资料,设置访问令牌

2、获取当前用户所有可见的项目

接口地址
GET请求
http://gitlab访问地址/api/v4/projects?private_token=xxx
返回参数
[{"id": 1,"description": "This project is automatically generated and helps monitor this GitLab instance. [Learn more](/help/administration/monitoring/gitlab_self_monitoring_project/index).","name": "Monitoring","name_with_namespace": "GitLab Instance / Monitoring","path": "Monitoring","path_with_namespace": "gitlab-instance-d71d8d97/Monitoring","created_at": "2021-07-12T08:41:01.299Z","default_branch": "main","tag_list": [],"topics": [],"ssh_url_to_repo": "git@gitlab.example.cn:gitlab-instance-d71d8d97/Monitoring.git","http_url_to_repo": "http://gitlab.example.cn/gitlab-instance-d71d8d97/Monitoring.git","web_url": "http://gitlab.example.cn/gitlab-instance-d71d8d97/Monitoring","readme_url": null,"avatar_url": null,"forks_count": 0,"star_count": 0,"last_activity_at": "2021-07-12T08:41:01.299Z","namespace": {"id": 2,"name": "GitLab Instance","path": "gitlab-instance-d71d8d97","kind": "group","full_path": "gitlab-instance-d71d8d97","parent_id": null,"avatar_url": null,"web_url": "http://gitlab.example.cn/groups/gitlab-instance-d71d8d97"},"_links": {"self": "http://gitlab.example.cn/api/v4/projects/1","issues": "http://gitlab.example.cn/api/v4/projects/1/issues","merge_requests": "http://gitlab.example.cn/api/v4/projects/1/merge_requests","repo_branches": "http://gitlab.example.cn/api/v4/projects/1/repository/branches","labels": "http://gitlab.example.cn/api/v4/projects/1/labels","events": "http://gitlab.example.cn/api/v4/projects/1/events","members": "http://gitlab.example.cn/api/v4/projects/1/members"},"packages_enabled": true,.........}
]
这里我们只需要关注项目id即可
3、获取当前项目所有分支
接口地址
GET请求
http://gitlab访问地址/api/v4/projects/项目id/repository/branches?private_token=xxx
返回参数
[{"name": "main","commit": {"id": "2d3e01fbedf088fccb5000303428df35c09ea07d","short_id": "2d3e01fb","created_at": "2023-01-06T02:52:54.000+00:00","parent_ids": null,"title": "xxxxxx","message": "xxxxxx","author_name": "xxxx","author_email": "xxxx@example.cn","authored_date": "2023-01-06T02:52:54.000+00:00","committer_name": "xxxx","committer_email": "xxxx@example.cn","committed_date": "2023-01-06T02:52:54.000+00:00","trailers": null,"web_url": "http://gitlab.example.cn/example/-/commit/2d3e01fbedf088fccb5000303428df35c09ea07d"},"merged": false,"protected": true,"developers_can_push": false,"developers_can_merge": false,"can_push": true,"default": true,"web_url": "http://gitlab.example.cn/example/-/tree/main"}
]
4、遍历分支,根据分支name获取commits
接口地址
GET请求
http://gitlab访问地址/api/v4/projects/项目id/repository/commits?ref_name=main&private_token=xxx
返回参数
[{"id": "8fc81980222370d51c11cd9bc609f10f3b7d9828","short_id": "8fc81980","created_at": "2022-07-21T08:46:35.000+00:00","parent_ids": [],"title": "Initial commit","message": "Initial commit","author_name": "xxxx","author_email": "xxxx@example.cn","authored_date": "2022-07-21T08:46:35.000+00:00","committer_name": "xxxx","committer_email": "xxxx@example.cn","committed_date": "2022-07-21T08:46:35.000+00:00","trailers": {},"web_url": "http://gitlab.example.cn/example/-/commit/8fc81980222370d51c11cd9bc609f10f3b7d9828"}
]
5、根据commit的id获取代码量
接口地址
GET请求
http://gitlab访问地址/api/v4/projects/项目id/repository/commits/commit的id?private_token=xxx
返回参数
{"id": "8fc81980222370d51c11cd9bc609f10f3b7d9828","short_id": "8fc81980","created_at": "2022-07-21T08:46:35.000+00:00","parent_ids": [],"title": "Initial commit","message": "Initial commit","author_name": "xxxx","author_email": "xxxx@example.cn","authored_date": "2022-07-21T08:46:35.000+00:00","committer_name": "xxxx","committer_email": "xxxx@example.cn","committed_date": "2022-07-21T08:46:35.000+00:00","trailers": {},"web_url": "http://gitlab.example.cn/example/-/commit/8fc81980222370d51c11cd9bc609f10f3b7d9828","stats": {"additions": 92,"deletions": 0,"total": 92},"status": null,"project_id": 1,"last_pipeline": null
}
stats节点下参数就是我们本次提交的代码量,additions为新增行数,deletions为删除行数,total为总数。
修改操作实际上是删除之后再新增。
注:通过API获取gitlab项目、分支、commits时,默认只能查到20条数据,可以增加入参指定每页数量,数量最大为50000

Java代码实现
private void gitLab() throws Exception {JSONObject params = new JSONObject();params.put("private_token", "xxx");params.put("per_page", "50000");//项目列表String result = WebUtils.doGet("http://gitlab.example.cn/api/v4/projects", params);JSONArray projects = JSONArray.parseArray(result);for (Object project : projects) {JSONObject projectValue = JSONObject.parseObject(project.toString());String projectId = projectValue.getString("id");//commits列表String url = String.format("http://gitlab.example.cn/api/v4/projects/%s/repository/commits", projectId);result = WebUtils.doGet(url, params);int additions = 0;int deletions = 0;int total = 0;JSONArray commits = JSONArray.parseArray(result);for (Object commit : commits) {JSONObject commitValue = JSONObject.parseObject(commit.toString());String commitId = commitValue.getString("id");url = String.format("http://gitlab.example.cn/api/v4/projects/%s/repository/commits/%s", projectId, commitId);//提交记录result = WebUtils.doGet(url, params);JSONObject commitStats = JSONObject.parseObject(result);JSONObject stats = commitStats.getJSONObject("stats");additions += stats.getIntValue("additions");deletions += stats.getIntValue("deletions");total += stats.getIntValue("total");}String name = projectValue.getString("name");LoggerUtils.info(String.format("项目:%s ,新增:%d ,删除:%d ,合计:%d", name, additions, deletions, total));}
}
以上是按照项目统计,扩展类似按作者统计是相同道理
相关文章:
GitLab统计代码量
gitlab官方文档:https://docs.gitlab.com/ee/api/index.html 1、生成密钥 登录gitlab,编辑个人资料,设置访问令牌 2、获取当前用户所有可见的项目 接口地址 GET请求 http://gitlab访问地址/api/v4/projects?private_tokenxxx 返回参数 …...
Linux TCP MIB统计汇总
概述 在 linux > 4.7 才将所有TCP丢包收敛到 函数 tcp_drop 中 指标详解 cat /proc/net/netstat 格式化命令 cat /proc/net/netstat | awk (f0) {name$1; i2; while ( i<NF) {n[i] $i; i }; f1; next} (f1){ i2; while ( i<NF){ printf "%s%s %d\n", …...
记录 docker linux部署jar
第一步 web sso user admin 中yml文件还原到阿里mysql数据库 第二步 各个jar进行打包处理 第三步 正式服务器的Jar备份 第四步 拉取以上jar包 到正式服务器中 第五步 查看 docker images 其中 web_service 1.0.2是上一个版本 上一个版本build 镜像命令是这样的(需…...
【Linux】教你用进程替换制作一个简单的Shell解释器
本章的代码可以访问这里获取。 由于程序代码是一体的,本章在分开讲解各部分的实现时,代码可能有些跳跃,建议在讲解各部分实现后看一下源代码方便理解程序。 制作一个简单的Shell解释器 一、观察Shell的运行状态二、简单的Shell解释器制作原理…...
onMeasure里如何重置只有1个子view一行满屏, 若有多个自适应一行
onMeasure里如何重置只有1个子view一行满屏, 若有多个自适应一行 可以尝试在 onMeasure 方法中重写 measureChildWithMargins 或 measureChild 方法来实现这个需求。 对于只有一个字的 View,我们可以把它的宽度设为屏幕宽度,高度设为最大高度,这样这个 View 就会占满一整行…...
Postman创建项目 对接口发起请求处理
查看本文之前 您需要理解了解 Postman 的几个简单工作区 如果还没有掌握 可以先查看我的文章 简单认识 Postman界面操作 那么 掌握之后 我们就可以正式来开启我们的接口测试 我们先选择 Collections 我们点上面这个加号 多拉一个项目出来 然后 我们选我们刚加号点出来的项目…...
在Vue3项目中js-cookie库的使用
文章目录 前言1.安装js-cookie库2.引入、使用js-cookie库 前言 今天分享一下在Vue3项目中引入使用js-cookie。 1.安装js-cookie库 js-cookie官网 安装js-cookie,输入 npm i js-cookie安装完成可以在package.json中看到: 安装以后,就可…...
【论文笔记】Attention和Visual Transformer
Attention和Visual Transformer Attention和Transformer为什么需要AttentionAttention机制Multi-head AttentionSelf Multi-head Attention,SMA TransformerVisual Transformer,ViT Attention和Transformer Attention机制在相当早的时间就已经被提出了&…...
独立IP服务器和共享IP服务器有什么区别
在选择一个合适的服务器时,最常见的选择是共享IP服务器和独立IP服务器。尽管两者看起来很相似,但它们有着很大的不同。本文将详细介绍共享IP服务器和独立IP服务器的不同之处,以及如何选择适合您需求的服务器。 一、什么是共享IP服务器? 共享…...
Java8
Java8 (一)、双列集合(二)、Map集合常用api(三)、Map集合的遍历方式(四)、HashMap(五)、LinkedHashMap(六)、TreeMap(七&a…...
nn.conv1d的输入问题
Conv1d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue) in_channels(int) – 输入信号的通道。在文本分类中,即为词向量的维度out_channels(int) – 卷积产生的通道。有多少个out_channels,就需要多少个1维…...
js判断是否为null,undefined,NaN,空串或者空对象
js判断是否为null,undefined,NaN,空串或者空对象 这里写目录标题 js判断是否为null,undefined,NaN,空串或者空对象特殊值nullundefinedNaN空字符串("")空对象(…...
Java每日一练(20230501)
目录 1. 路径交叉 🌟🌟 2. 环形链表 🌟🌟 3. 被围绕的区域 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…...
从零开始学习Web自动化测试:如何使用Selenium和Python提高效率?
B站首推!2023最详细自动化测试合集,小白皆可掌握,让测试变得简单、快捷、可靠https://www.bilibili.com/video/BV1ua4y1V7Db 目录 引言: 一、了解Web自动化测试的基本概念 二、选择Web自动化测试工具 三、学习Web自动化测试的…...
fastdfs环境搭建
安装包下载路径 libfastcommon下载地址:https://github.com/happyfish100/libfastcommon/releasesFastDFS下载地址:https://github.com/happyfish100/fastdfs/releasesfastdfs-nginx-module下载地址:https://github.com/happyfish100/fastdf…...
有什么牌子台灯性价比高?性价比最高的护眼台灯
由心感叹现在的孩子真不容易,学习压力比我们小时候大太多,特别是数学,不再是简单的计算,而更多的是培养学生其他思维方式,有时候我都觉得一年级数学题是不是超纲了。我女儿现在基本上都是晚上9点30左右上床睡觉&#x…...
信息系统项目管理师 第9章 项目范围管理
1.管理基础 1.产品范围和项目范围 产品范围:某项产品、服务或成果所具有的特征和功能。根据产品需求来衡量。 项目范围:包括产品范围,是为交付具有规定特性与功能的产品、服务或成果而必须完成的工作。项目管理计划来衡量 2.管理新实践 更加注重与商业分析师一起…...
【Android入门到项目实战-- 8.2】—— 使用HTTP协议访问网络
目录 一、使用HttpURLConnection 1、使用Android的HttpURLConnection步骤 1)获取HttpURLConnection实例 2)设置HTTP请求使用的方法 3)定制HTTP请求,如连接超时、读取超时的毫秒数 4)调用getInputStream()方法获取返回的输入流 5)关闭HTTP连接 2、…...
Go官方指南(五)并发
Go 程 Go 程(goroutine)是由 Go 运行时管理的轻量级线程。 go f(x, y, z) 会启动一个新的 Go 程并执行 f(x, y, z) f, x, y 和 z 的求值发生在当前的 Go 程中,而 f 的执行发生在新的 Go 程中。 Go 程在相同的地址空间中运行,…...
VS快捷键大全 | 掌握这些快捷键,助你调试快人一步
欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
