Git统计代码行数;Java实现统计代码行数,忽略空行、注释行

news2024/9/22 21:27:39

前言

某天,产品叫我算下某个项目的代码行数,我一愣,这怎么统计?总不可能一个文件一个文件算吧?后面我找了下,git是可以统计提交到仓库的所有的代码的,不过有个问题,就是假如有些文件我不想算进去怎么办?之后我再查了下,可以只统计指定文件类型的代码的。

Git统计代码行数

在指定项目文件夹里,打开git命令窗口,执行下面的命令(直接复制)

1、统计所有行数

git log --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { 
printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'

或者

git ls-files | xargs cat | wc -l

上面两个命令只统计行数,没有细分到文件,下面这个命令是会把每个文件都列出来,并统计每个文件的行数。

 git ls-files | xargs wc -l

2、统计指定文件类型的行数

find . "(" -name "*.java" -or -name "*.xml" -or -name "*.yml" -or -name "*.properties" ")" -print | xargs wc -l

在这里插入图片描述
这个命令会打印出文件和对应的行数。

3、统计某个用户的代码量

git log --author="username" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { 
printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'

4、统计某个时间段内的代码量

git log --since=2022-12-06 --until==2022-12-07 --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { 
printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'

--since:起始时间,--until:终止时间

5、统计某个用户某个时间段内的代码量

git log --since =2022-12-06 --until==2022-12-07 --author="username" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { 
printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'

还有其他命令,可以参考下 这篇文章 ,比较全。

Java实现统计代码行数

Git可以统计代码行数,但是如果我不想要空行和注释行也算进去怎么办?我找了下,好像没有命令可以忽略空行或注释行,既然Git不行,那我们就自己用代码实现统计。


要统计总代码量,得遍历这个项目下的全部文件,然后读取文件内容,遍历每一行的内容,如果是空行或者注释行就忽略。

实现

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class 统计代码行数 {

    private static long 空行数 = 0;
    private static long 注释行数 = 0;
    private static long 代码行数 = 0;
    private static long 总行数 = 0;

    public static void main(String[] args) {
    	// 这里只统计 \src\main 文件夹里的文件,其他文件像 .idea、test 这些文件夹里的就不算进去了
        循环文件夹("D:\\Java\\workspace\\AssetsJava","\\src\\main\\");
        System.out.println("空行:" + 空行数);
        System.out.println("注释行:" + 注释行数);
        System.out.println("代码行:" + 代码行数);
        System.out.println("总行:" + 总行数);
    }

    private static void 循环文件夹(String 项目路径,String 只统计指定文件夹) {
        File f = new File(项目路径);
        if (!f.exists()){
            System.out.println("项目路径不存在!");
            return;
        }
        File[] childs = f.listFiles(); // 获取这个项目下的文件、文件夹
        for (int i = 0; i < childs.length; i++) {
            File child = childs[i];
            if (!child.isDirectory()) { // 当前文件不是文件夹,就读取
                if (child.getParent().contains(只统计指定文件夹)){ // java文件、xml文件、配置文件 只统计main文件夹下的
                    if (child.getName().matches(".*\\.java$") || child.getName().endsWith(".yml") ||
                            child.getName().endsWith(".properties") || child.getName().endsWith(".xml")) {
                        long 单个文件代码行数 = 统计代码行数(child);
                        System.out.println(单个文件代码行数+"\t\t"+child.getName());
                    }
                }else if ("pom.xml".equals(child.getName())){
                    long 单个文件代码行数 = 统计代码行数(child);
                    System.out.println(单个文件代码行数+"\t\t"+child.getName());
                }
            }else { // 当前文件是文件夹,继续递归
                循环文件夹(child.getPath(),只统计指定文件夹);
            }
        }
    }

    private static long 统计代码行数(File file){
        long 单个文件代码行数 = 0;
        BufferedReader br = null;
        try{
            br = new BufferedReader(new FileReader(file));
            String line = "";
            boolean flag = false; // 用于标记xml多行注释,为true表示当前行在多行注释中,一直到最后一行注释
            while ((line = br.readLine()) != null){
                总行数++;
                String 内容 = line.trim(); // 每一行的内容,去掉空格
                if (flag){
                    注释行数++;
                    // 当多行注释结尾是 --> 说明多行注释结束,重新标记为false,表示当前不在统计多行注释
                    if (内容.endsWith("-->")) flag = false;
                }else {
                    if (内容.length() == 0){
                        空行数++;
                    }else if (内容.startsWith("//") || 内容.startsWith("/**") || 内容.startsWith("*") ||
                            内容.startsWith("*/") || 内容.startsWith("/*") || 内容.startsWith("#")){
                        注释行数++;
                    }else if(内容.startsWith("<!--")){
                        注释行数++;
                        // 当前行属于xml的注释,且结尾不是 --> 时,表示是多行注释,设置标记为true
                        if (!内容.endsWith("-->")) flag = true;
                    }else {
                        代码行数++;
                        单个文件代码行数++;
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return 单个文件代码行数;
    }
}

统计结果

在这里插入图片描述
在这里插入图片描述
最后的总行数,是和用Git统计的总行数对得上的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在STM32F103C8T6上使用RT_Thread Nano移植控制台和Finsh

一、移植环境&#xff1a; 开发环境&#xff1a;Keil MDK 5.33 硬件平台&#xff1a;STM32F103C8T6 RT_Thread版本&#xff1a;RT-Thread Nano V3.1.5 二、在RT-Thread Nano V3.1.5添加uart控制台 1.需要在rtconfig.h开启以下两个宏 1&#xff09;#define RT_USING_CONSO…

ITK (1)窗宽窗位的意义与设置

背景与意义 医学图像与传统可视化图像相比&#xff0c;其具有更大的“灰度”范围。如&#xff0c;普通图像&#xff08;灰度图像&#xff09;的灰度范围一般是256级&#xff08;即图像中最亮的点的灰度值定义为0&#xff0c;最亮的定义为255&#xff0c;也就是2^8&#xff0c;…

【图像处理OpenCV(C++版)】——2.1 深入理解OpenCV之Mat类及相关成员函数

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…

【论文阅读31】《OptCuts: Joint Optimization of Surface Cuts and Parameterization》

目录 一些疑惑 0 引言 1 introduction 2 related work 2.1 parameterization with fixed connectivity 2.2 Separate Cut Computation 3 problem statement ​编辑​ 3.1 数学形式1 3.2 数学形式2 3.3 能量函数 3.3.1 接缝线长度&#xff08;归一化&#xff09;&am…

程序员们,你会考虑使用中文编程吗?

众所周知&#xff0c;编程语言有一条无形的“鄙视链”。 Java和C#相互不服&#xff0c;并且看不起写Python的&#xff0c;Python看不起PHP&#xff0c;PHP看不起前端。而中文编程就在这个语言“鄙视链”的底端艰难生存。 有人对中文编程嗤之以鼻&#xff0c;相比于“人生苦短…

免费网课题库系统接口

免费网课题库系统接口 本平台优点&#xff1a;免费查题接口搭建 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a;题库后台http://daili.jueguangzhe.cn/ 题…

[附源码]计算机毕业设计JAVA职业中介信息管理系统

[附源码]计算机毕业设计JAVA职业中介信息管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

Java进阶——IO流(I)

文章目录IO流一、文件1.1、文件流1.2、常用的文件操作1.2.1、创建文件对象相关构造和方法1.2.2、获取文件的相关信息1.2.3、目录的操作和文件删除二、IO流原理及流的分类2.1、Java IO流的原理2.2、流的分类2.3、IO流常用的类2.3.1、InputStream&#xff1a;字节输入流FileInput…

SSH 远程连接协议详解

一、SSH 协议 1、SSH 协议简介 SSH全称是Secure Shell,SSH协议是基于应用层的协议,为远程登录会话和其他网络服务提供安全性的协议。 SSH使用最多的是远程登录和传输文件,实现此功能的传统协议都不安全(ftp、telnet等),因为它们使用明文传输数据,而SSH在传输过程中的…

【云原生.docker】docker部署Redis集群

1、镜像拉取 docker pull redis:5.0.5 2、容器启动 docker run -d --nameredis-6400 --net host --privilegedtrue -v /home/dev/toms/docker_redis/data/redis-6400:/data redis:5.0.5 --cluster-enabled yes --appendonly yes --port 6400 & docker run -d --nameredis-…

在抖音及一些直播上,如何进行违禁词在线检测呢?

本文首发于&#xff1a;行者AI谛听 随着直播行业的兴起&#xff0c;越来越多的网红主播纷纷加入&#xff0c;平台的审核能力也面临着巨大的挑战&#xff0c;相对于平台的严格监管&#xff0c;很多主播也需要进行深层学习&#xff0c;避免在直播中出行违规。 其实很多主播在直播…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java小型餐饮综合管理系统j1c7m

首先选择计算机题目的时候先看定什么主题&#xff0c;一般的话都选择当年最热门的话题进行组题&#xff0c;就比如说&#xff0c;今年的热门话题有奥运会&#xff0c;全运会&#xff0c;残运会&#xff0c;或者疫情相关的&#xff0c;这些都是热门话题&#xff0c;所以你就可以…

文档对象模型 (DOM) :初学者介绍和指南

果你已经使用JavaScript一段时间了&#xff0c;你可能相当熟悉DOM&#xff08;文档对象模型&#xff09;和CSSOM&#xff08;CSS对象模型&#xff09;脚本。除了 DOM 和 CSSOM 规范定义的接口之外&#xff0c;CSSOM 视图模块中还指定了方法和属性的子集&#xff0c;从而提供了用…

Vue3知识点之数据侦测

Vue 的核心之一就是响应式系统&#xff0c;通过侦测数据的变化&#xff0c;来驱动更新视图。 实现可响应对象的方式 通过可响应对象&#xff0c;实现对数据的侦测&#xff0c;从而告知外界数据变化。实现可响应对象的方式&#xff1a; getter 和 setterdefinePropertyProxy …

IB课程工具书单,助力你考高分

亚马逊汇总了近期最畅销的IB课程工具书单&#xff0c;该书单以购买量和评分进行综合排名。其中的许多书籍都是IBDP学生可选用的绝佳工具书&#xff01;1、Physics for the IB Diploma Coursebook 这本书涵盖了IB 2016年首考的物理课程要求。这本课程手册的第六版针对IB物理教学…

写出go程序

1.安装go包 下载地址&#xff1a;https://golang.google.cn/dl/ 2.安装vscode 下载地址&#xff1a;https://code.visualstudio.com/ 安装好后 以打开文件夹形式打开.go文件。 该文件自己创建一个即可。

怎么视频提取音频文件?分享这3种简单实用的提取方法

不知道大家平时用手机刷视频的时候&#xff0c;会不会被一些好听的背景音乐给吸引了呢&#xff1f;这些背景音乐大多都是网友们自己合成导入视频上传的&#xff0c;可能在许多音乐平台都不能找到音源播放。遇到这样的情况&#xff0c;大家一定都很苦恼吧&#xff1f;但其实&…

Fluorescein(5-isomer)-DBCO,2054339-00-1,二苯基环辛炔-FITC(5-异构体)

一、理论分析&#xff1a; 中文名&#xff1a;二苯基环辛炔-FITC(5-异构体)&#xff0c;二苯并环辛炔-荧光素(5-异构体) 英文名&#xff1a;DBCO-FITC(5-isomer)&#xff0c;5-FITC-DBCO&#xff0c;Fluorescein(5-isomer)-DBCO CAS号&#xff1a;2054339-00-1 化学式&#xff…

遥感影像目标检测:从CNN(Faster-RCNN)到Transformer(DETR)实践技术应用

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…

代码随想录第一天

专题&#xff1a;数组 题目&#xff1a;二分查找 题目要求&#xff1a; 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。…