如果每天工资按代码行数来算,来看看你每天工资是多少
说在前面
😼😼如果每天的工资取决于我们所编写的代码行数,那么我们的生活会发生怎样的改变?来看看你的同事们今天都提交了多少代码吧,看看谁是卷王,谁在摸鱼(🐶🐶狗头保命,光看代码量并无法准确衡量工作量)
代码实现
获取用户列表
- 使用
git log命令来获取提交记录,并通过--format='%aN'参数指定只返回作者姓名。
const command = `git log --format='%aN'`;
- 使用
child_process.execSync函数同步执行命令,并将结果转换为字符串形式。.toString()将结果转换为字符串,.replaceAll("'", "")移除结果中可能存在的单引号'。
const res = child_process.execSync(command).toString().replaceAll("'", "");
- 首先使用
.trim()去掉结果两端的空白字符,然后使用.split("\n")将字符串按行拆分为数组。接着使用[...new Set()]创建一个 Set(集合)对象,并通过扩展运算符...将 Set 转换为数组,这样就可以去除重复的作者姓名
const usersList = [...new Set(res.trim().split("\n"))];
完整代码如下:
function getUserList() {const command = `git log --format='%aN'`;const res = child_process.execSync(command).toString().replaceAll("'", "");const usersList = [...new Set(res.trim().split("\n"))];return usersList;
}
获取指定用户当天修改代码行数
- 使用
git log命令来获取特定作者在当天内的提交记录。--author="${username}"指定了作者姓名,--since="midnight"指定了起始时间为当天零点,--until=23:59:59指定了结束时间为当天的最后一秒,--pretty=tformat:和--numstat用于指定输出格式为只包含新增和删除的行数。如果想要指定具体时间区间可以这样写:
git log --since="开始时间" --until="结束时间" --format="%aN <%aE>"
- 使用
child_process.execSync函数同步执行命令,并将结果转换为字符串形式,使用.trim()去掉结果两端的空白字符,然后使用.split("\n")将字符串按行拆分为数组,每个元素代表一行输出。每一行输出的信息如下图:

通过制表符(/t)可以将每一行分割为三个信息,分别代表添加行数、删除行数、修改文件路径,这里我们只需要获取添加行数和删除行数即可。从上面图片我们可以看出,添加图片的时候添加行数、删除行数都会使用-占位,我们需要注意下这种情况
完整代码如下:
function getCommitRecord(username) {const command = `git log --author="${username}" --since="midnight" --until=23:59:59 --pretty=tformat: --numstat`;const res = child_process.execSync(command).toString();// 将输出按行分割成数组const lines = res.trim().split("\n");let addedLines = 0;let removedLines = 0;// 遍历每行输出,提取新增和删除行数lines.forEach((line) => {const [added, removed] = line.split("\t");if (!isNaN(added)) {addedLines += parseInt(added) || 0;}if (!isNaN(removed)) {removedLines += parseInt(removed) || 0;}
});
获取所有用户当天提交记录
1、获取用户列表
const userList = getUserList();
2、获取每个用户的修改记录
const commitRecord = [];
userList.forEach((user) => {commitRecord.push(getCommitRecord(user));
});
3、修改行数排序并打印
(1)console.table
这里可以使用console.table来进行打印
console.table 是 JavaScript 中用于在控制台打印表格形式数据的函数。它接受一个包含对象或数组的参数,并将其以表格的形式打印到控制台上。
当你传入一个数组时,console.table 会将数组中的对象以表格的形式展示出来,每个对象的属性对应表格的列,对象实例对应表格的行。这对于查看复杂的数据结构,比如对象数组,非常有用。例如:
const people = [{ name: 'Alice', age: 25, city: 'New York' },{ name: 'Bob', age: 30, city: 'San Francisco' },{ name: 'Charlie', age: 28, city: 'Los Angeles' }
];
console.table(people);
上述代码会在控制台中以表格的形式打印出 people 数组中的对象数据,如下图:

同样地,当你传入一个对象时,console.table 也会以相同的方式打印出对象的属性和属性值。例如:
const person = { name: 'Alice', age: 25, city: 'New York' };
console.table(person);

(2)完整代码
console.table(commitRecord.sort((a, b) => b.总修改行数 - a.总修改行数),["作者", "添加行数", "删除行数", "总修改行数"],["border: 1px solid #fff; padding: 5px;"]
);
体验
插件安装
npm install -g jyeontu
查看修改行数
jyeontu git
选择获取当天用户提交行数


源码地址
gitee
https://gitee.com/zheng_yongtao/node-scripting-tool/tree/master/src/jyeontu
公众号
关注公众号『前端也能这么有趣』发送 jyeontu即可获取源码。
说在后面
🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『
前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。
相关文章:
如果每天工资按代码行数来算,来看看你每天工资是多少
说在前面 😼😼如果每天的工资取决于我们所编写的代码行数,那么我们的生活会发生怎样的改变?来看看你的同事们今天都提交了多少代码吧,看看谁是卷王,谁在摸鱼(🐶🐶狗头保命…...
TrueLicense实现授权管理
1、生成前准备 在生成授权文件前,首先需要密钥对插入:密钥对分为公钥与私钥,私钥需要本地储存不泄露,公钥需要对外提供;私钥内部包含证书,对于授权文件进行数字签名,相当于加密的步骤࿰…...
好用的样式动画库集合(css、js)
文章目录 前言一、Animate.css二、Anime.js三、CSShake四、Hover.css五、AniJS六、Animista七、Tachyons-animate八、Sequence.js九、Infinite十、OBNOXIOUS.CSS十一、MOTION UI十二、Keyframes.app十三、AnimXYZ十四、Whirl十五、Hamburgers十六、Vivify十七、Magic Animation…...
pandas教程:时区计数 USA.gov Data from Bitly USA.gov数据集
文章目录 Chapter 14 Data Analysis Examples(数据分析实例)14.1 USA.gov Data from Bitly(USA.gov数据集)1 Counting Time Zones in Pure Python(用纯python代码对时区进行计数)2 Counting Time Zones wit…...
野火霸天虎 STM32F407 学习笔记(六)系统时钟详解
STM32 中级 前言 仍然是学习自野火F407网课。 启动文件详解 作用: 初始化堆栈指针 SP_initial_sp初始化 PC 指针 Reset_Handler初始化中断向量表配置系统时钟调用 C 库函数 _main 初始化用户堆栈,从而最终调用 main 函数去到 C 的世界 栈ÿ…...
uni-app+vue3 封装全局函数(详细完整的方法)
在uni-app和vue3中,我们可以封装全局函数来复用代码。以下是详细的步骤: 首先,我们需要在main.js文件中引入我们封装的全局函数。这样我们就可以在整个项目中使用这些函数。 import globalFunctions from ./globalFunctionsVue.prototype.$g…...
游戏开发原画的设计方法
游戏原画设计是游戏开发中至关重要的一环,因为它直接影响到游戏的视觉吸引力和用户体验。以下是一些常见的游戏原画设计方法,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 理解游戏概念&…...
力扣labuladong一刷day19天花式遍历
力扣labuladong一刷day19天花式遍历 文章目录 力扣labuladong一刷day19天花式遍历一、48. 旋转图像二、54. 螺旋矩阵三、59. 螺旋矩阵 II 一、48. 旋转图像 题目链接:https://leetcode.cn/problems/rotate-image/ 思路:把矩阵向右旋转90度,要…...
自动化部署 扩容openGauss —— Ansible for openGauss
前言 大家好,今天我们为大家推荐一套基于Ansible开发的,自动化部署及扩容openGauss的脚本工具:Ansible for openGauss(以下简称 AFO)。 通过AFO,我们只需简单修改一些配置文件,即可快速部署多种…...
C#多线程创建及线程的同步
需求:有时为了能分时的调用多个任务运行,因此需要考虑多线程的编程方式 操作步骤如下: 1)创建线程并开启线程 Thread thread0 new Thread(() > DoWork0(0)); thread0.Start(); 2)编写线程函数 static void Do…...
MOM系统功能清单
什么是MOM系统? MOM系统是制造运营管理(Manufacturing Operation Management)的缩写。它是指通过协调管理企业的人员、设备、物料和能源等资源,把原材料或零件转化为产品的活动。MOM系统集成了生产计划、库存管理、生产调度、质量…...
ARM Cortex-M核的内核态,用户态
首先,用户态和内核态是从操作系统层面上来划分的,如果没有操作系统,我可以直接运行在特权模式下,并使用特权指令。在这种情况下,我将负责管理和控制系统资源,执行关键操作,以及确保系统的安全性…...
flex布局实战之自动填充剩余
案例目标 文字部分自适应并且居中 图中是一个弹窗,我现在使用flex的布局来实现,标题和关闭按钮。因为是uni-app,所以标签是view 。你可以自行替换为 代码 <view class"popup-box"><view class"title"><view class&…...
【LeetCode】203. 移除链表元素
203. 移除链表元素 难度:简单 题目 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出ÿ…...
IDEA2023版本创建Sping项目只能勾选17和21,却无法使用Java8?(已解决)
方案:替换创建项目的源 我们只知道IDEA页面创建Spring项目,其实是访问spring initializr去创建项目。故我们可以通过阿里云国服去间接创建Spring项目。将https://start.spring.io/或者http://start.springboot.io/替换为 https://start.aliyun.com/...
Vue生命周期详解
以下是 Vue 生命周期钩子函数分别做了什么事情的详细说明 详细说明 beforeCreate(创建前):在实例初始化之前调用。此时,实例的数据观测 (data observer)、属性和方法的运算,以及事件配置等内部设置都已完成࿰…...
政务大数据与资源平台建设解决方案:PPT全文75页,附下载
关键词:智慧政务解决方案,大数据解决方案,数据中心解决方案,数据治理解决方案 一、政务大数据与资源平台建设背景 1、政务大数据已成为智慧城市建设的必要基础 为响应国家不断加快5G基建、大数据、人工智能等新型基础设施建设布…...
环境监测传感器守护我们的地球
随着人类活动的不断增加,环境问题日益凸显。为了更好地保护我们的地球,环境监测成为了一项非常重要的任务。而在这个领域,传感器技术发挥着至关重要的作用。今天,我们就来聊聊WX-WQX12 环境监测传感器。 环境监测传感器是一种能够…...
PHP 循环控制 学习资料
PHP 循环控制 在 PHP 中,循环控制语句用于控制循环的执行流程,包括跳出循环、跳过当前迭代等操作。以下是 PHP 中常用的循环控制语句的介绍和示例: break 语句 break 语句用于立即跳出当前循环,并继续执行循环之后的代码。 示…...
Unity 关于生命周期函数的一些认识
Unity 生命周期函数主要有以下一些: Awake(): 在脚本被加载时调用。用于初始化对象的状态和引用。 OnEnable(): 在脚本组件被启用时调用。在脚本组件被激活时执行一次,以及在脚本组件被重新激活时执行。 Reset(): 在脚本组件被重置时调用。用于重置脚本…...
告别if-else地狱!在Godot 4.4里用状态机重构你的2D角色控制器
告别if-else地狱!在Godot 4.4里用状态机重构你的2D角色控制器 当你的2D平台游戏角色开始拥有跑跳、攻击、滑铲等复杂动作时,脚本里层层嵌套的if-else判断会像野草般疯长。上周我接手一个项目,发现玩家控制器脚本竟有200多行条件判断——添加新…...
Wonder3D:2-3分钟从单张图片生成高质量3D模型的完整指南
Wonder3D:2-3分钟从单张图片生成高质量3D模型的完整指南 【免费下载链接】Wonder3D Single Image to 3D using Cross-Domain Diffusion for 3D Generation 项目地址: https://gitcode.com/gh_mirrors/wo/Wonder3D 单图生成3D模型一直是计算机视觉领域的挑战性…...
aibiye的AI改写工具为解决论文30%重复率问题,总结出五条实用技巧。包括语义重组、逻辑优化等策略,显著改善文本原创性,助力论文高效通过检测。
嘿,大家好!我是AI菌。今天咱们来聊聊一个让无数学生头疼的问题:论文重复率飙到30%以上怎么办?别慌,我这就分享5个实用降重技巧,帮你一次搞定,轻松压到合格线以下。这些方法都是我亲身试验过的&a…...
告别K-Means!用DBSCAN在MATLAB里搞定任意形状的数据聚类(附完整代码)
突破传统聚类局限:DBSCAN在MATLAB中的实战应用指南 当面对复杂数据集时,许多数据分析师的第一反应是使用K-Means这类经典算法。但你是否遇到过这样的困境:明明数据呈现明显的聚集特征,K-Means给出的结果却支离破碎?或者…...
Fish Speech 1.5零样本语音克隆实操:10秒参考音频生成中英日韩多语种语音
Fish Speech 1.5零样本语音克隆实操:10秒参考音频生成中英日韩多语种语音 想不想让AI用你朋友的声音说一段话?或者用某个电影角色的音色,为你朗读一段外语新闻?过去,这需要专业的录音设备和复杂的模型训练。但现在&am…...
别再只用Curl了!用libhv的HttpClient类,5分钟搞定C++里的GET/POST请求
别再只用Curl了!用libhv的HttpClient类,5分钟搞定C里的GET/POST请求 如果你还在用Curl命令行工具或者复杂的libcurl API来处理C项目中的HTTP请求,那么是时候认识一下libhv了。这个轻量级、高性能的网络库,用起来简直像在写Python一…...
告别CAJ格式束缚:caj2pdf开源工具深度解析与实战指南
告别CAJ格式束缚:caj2pdf开源工具深度解析与实战指南 【免费下载链接】caj2pdf Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF。佛系转换,成功与否,皆是玄学。 项目地址: https://gitcode.com/gh_…...
MySQL超详细安装教程(保姆级)
1.官网下载mysql安装包 MySQL :: 下载MySQL社区服务器https://dev.mysql.com/downloads/mysql/ 2.下载完成后解压到一个文件夹 注意:不带中文 这个路径要记住,我们等下会用到 3.添加环境变量 环境变量里面有很多选项,这里我们只用到Path这…...
Granite-4.0-H-350M应用案例:自动生成新闻网站数据抓取脚本
Granite-4.0-H-350M应用案例:自动生成新闻网站数据抓取脚本 1. 新闻数据抓取的需求与挑战 在信息爆炸的时代,新闻数据抓取已成为许多企业和研究机构的刚需。无论是舆情监控、市场分析还是内容聚合,都需要从各类新闻网站高效获取结构化数据。…...
掌握Node.js开发的102个终极最佳实践:从新手到专家的完整指南
掌握Node.js开发的102个终极最佳实践:从新手到专家的完整指南 【免费下载链接】nodebestpractices :white_check_mark: The Node.js best practices list (July 2024) 项目地址: https://gitcode.com/GitHub_Trending/no/nodebestpractices 你是否曾经在Node…...
