Git 统计代码行数

花了一周多,用 Verilog 写完一个 CPU(Github Repository: HeliumCPUv2-MIPS32),想看看自己究竟写了多少行,但是居然没有什么简单的做法。Github 也没有相关统计,怎么办呢?

查了查 Stackoverflow:Count number of lines in a git repository,确实给了一些做法。然后我学了学 Bash 的一些用法,采用了下面的方法。

首先,git ls-files 会给出仓库里没有 Ignore 的文件,我们把它用管道和 xargs 传给 wcwc 即 "Word Count",-l 选项可以打印出行数;xargs 相当于将管道进来的输入作为命令行参数传给调用的命令。

1
git ls-files | xargs wc -l

那么就可以得到一些结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   6 .gitignore
21 LICENSE
43 Makefile
111 README.md
1058 assets/MulticycleCounter.png
0 assets/PipelineCtrlHazard.drawio
381 assets/PipelineCtrlHazard.drawio.png
0 assets/PipelineDataHazard.drawio
376 assets/PipelineDataHazard.drawio.png
0 assets/PipelineDataPath.drawio
272 assets/PipelineDataPath.drawio.png
1512 assets/PipelineHazards.png
1143 assets/SingleCycleCounter.png
0 assets/SingleCycleDataPath.drawio
212 assets/SingleCycleDataPath.drawio.png
52 common/dbg_mems/dbg_dmem.v
26 common/dbg_mems/dbg_imem.v
53 common/dbg_mems/dbg_mem.v
112 common/ex/alu.v
348 common/id/control.v

... # Many lines omitted

1024 sim/dmem.data
16 sim/imem.text
34 sim/testbench.v
31 single_cycle/counter.v
155 single_cycle/cpu.v
41 single_cycle/top.v
9179 total

它几乎把所有的行数都统计进来了,其中也包括一些没忽略的生成的文件(如数据段 dmem.data),并不能算写的代码,那么,可以把 git ls-files 出来的结果再正则一下,比如只统计 .v 文件

1
git ls-files | grep ".*\.v" | xargs wc -l

输出就干净多了,数的行数也正确

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  52 common/dbg_mems/dbg_dmem.v
26 common/dbg_mems/dbg_imem.v
53 common/dbg_mems/dbg_mem.v
112 common/ex/alu.v
348 common/id/control.v
142 common/id/decoder.v
54 common/id/regfile.v
38 common/if/pc.v
86 common/mem/mem.v
33 common/wb/writeback.v
168 includes/defines.v
132 multicycle/counter.v
162 multicycle/cpu.v
41 multicycle/top.v
26 pipeline/control_regs.v
295 pipeline/cpu.v
97 pipeline/forward.v
76 pipeline/hazard.v
41 pipeline/if.v
40 pipeline/top.v
26 pipeline_bp/control_regs.v
318 pipeline_bp/cpu.v
97 pipeline_bp/forward.v
118 pipeline_bp/hazard.v
97 pipeline_bp/if.v
40 pipeline_bp/top.v
34 sim/testbench.v
31 single_cycle/counter.v
155 single_cycle/cpu.v
41 single_cycle/top.v
2979 total

我在 MacOS 得到的如上结果,Linux 的各发行版几乎都行,Windows 就乖乖使用 WSL 吧。