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

Posted 符华-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git统计代码行数;Java实现统计代码行数,忽略空行注释行相关的知识,希望对你有一定的参考价值。

前言

某天,产品叫我算下某个项目的代码行数,我一愣,这怎么统计?总不可能一个文件一个文件算吧?后面我找了下,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统计的总行数对得上的。

以上是关于Git统计代码行数;Java实现统计代码行数,忽略空行注释行的主要内容,如果未能解决你的问题,请参考以下文章

代码统计工具,要支持差异统计,如:代码修改行数、删除行数、新增行数等

GIT命令行统计代码提交行数

Ubuntu下统计代码行数

gitlab有没有办法一次性统计所有分支的代码行数?

git统计补丁个数和代码行数

git统计代码工程总行数和细分每个代码文件行数