为什么要做这件事?

老实说,我平时不太在意自己到底写了多少行代码。

一方面是因为这东西真没啥太大参考价值,想刷行数的话,复制粘贴个几千行都不是事;另一方面也是因为谁都知道:代码质量和行数没什么关系

但有时候,好奇心就是挡不住。
就像你听到别人讲“十万小时定律”的时候,会突然想:

“哎,那我到底练习了多久?”

我写代码已经很多年了,也做了不少项目,大部分都丢在 GitHub 上没怎么管过。突然有天我就想:
“我这几年到底写了多少行代码?”

没什么远大目标,也不是为了攀比,就是想统计一下,纯图一乐。


发现了一个小工具:cloc

为了满足这个好奇心,我去搜了一下有没有能统计代码行数的工具,结果发现了一个叫 cloc 的小东西。

用起来特别方便,直接在命令行跑一下,它就会帮你统计:

  • 每种语言用了多少文件;
  • 每种语言写了多少代码行;
  • 有多少注释行、空白行;

而且输出格式非常清爽,长这样:

1
2
3
4
5
6
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
PHP 213 4521 2349 19432
JavaScript 75 1833 1102 10231
...

看着还挺有成就感的(笑)。


但问题是:我的代码都在 GitHub 上

工具虽然好用,但有个问题:

我的代码都放在 GitHub 上,平时根本没下载到本地,如果我想统计,就得先一个个仓库 clone 下来,太麻烦了。

所以我干脆就写了个脚本,把整个流程自动化了。


脚本主要做了三件事:

  1. 通过 GitHub 官方的 gh 命令获取我账号下的所有仓库;
  2. 把这些仓库一个个同步到本地(已有就 pull,没有就 clone);
  3. 然后用 cloc 统计整个目录的代码行数,并排除掉构建/依赖目录。

简单说,就是把 GitHub 上的项目都打包带回家,然后用 cloc 数一数。


工具准备(支持 macOS / Ubuntu / Windows)

这个脚本依赖以下几个命令行工具:

  • gh:GitHub CLI,用于获取仓库列表;
  • jq:命令行 JSON 解析工具,用于处理接口返回的数据;
  • cloc:统计代码行数的小工具;
  • git:当然少不了,用来 clone 仓库。

macOS 安装方法(用 Homebrew):

1
brew install gh jq cloc git

Ubuntu / Debian 安装方法:

1
2
sudo apt update
sudo apt install gh jq cloc git

Windows 安装方法(建议用 WSL)

Windows 用户建议安装 WSL(Windows 子系统) 并使用 Ubuntu:

  1. 在 PowerShell(管理员)运行:

    1
    wsl --install
  2. 安装完成后打开 Ubuntu;

  3. 安装依赖:

    1
    2
    sudo apt update
    sudo apt install gh jq cloc git

GitHub CLI 登录一次(非常重要)

运行脚本前,请先登录 GitHub CLI:

1
gh auth login

它会引导你通过浏览器进行一次性授权。


脚本源码(可以直接用)

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
#!/bin/bash

USERNAME="zxc7563598" # 👈 改成你的 GitHub 用户名
WORKDIR="$HOME/github_repos"

# 创建存放仓库的目录
mkdir -p "$WORKDIR"
cd "$WORKDIR" || exit

echo "📥 正在获取 $USERNAME 的所有仓库..."

# 获取所有仓库的 HTTPS 地址(最多 200 个,可改成 1000)
gh repo list $USERNAME --limit 200 --json nameWithOwner,url \
| jq -r '.[].url' | while read repo; do
reponame=$(basename "$repo")
if [ -d "$reponame" ]; then
echo "🔄 更新仓库: $reponame"
cd "$reponame" && git pull --quiet && cd ..
else
echo "⬇️ 克隆仓库: $reponame"
git clone --depth=1 "$repo" --quiet
fi
done

echo ""
echo "📊 开始统计代码行数(排除 node_modules、vendor、dist、build、public)..."
echo ""

cloc --exclude-dir=node_modules,vendor,dist,build,public --exclude-lang=JSON .

运行结果展示

执行脚本后,大概就会看到类似这样的输出结果(我的结果):

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
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
PHP 2334 14079 60356 613174
Vuejs Component 232 2273 1207 29480
JavaScript 198 2769 2813 16292
CSS 13 1566 182 13460
YAML 15 3345 1 12314
HTML 43 507 262 11776
Markdown 52 1881 11 4773
Blade 27 386 52 3942
Go 4 80 65 887
WXSS 10 118 19 753
Bourne Shell 7 106 104 415
SVG 350 0 0 415
WXML 9 7 16 295
Protocol Buffers 1 2 0 187
C 1 6 0 101
Python 1 32 29 91
XML 1 0 2 29
INI 2 4 0 20
Dockerfile 1 1 0 5
DOS Batch 1 0 0 3
CSV 1 0 0 2
-------------------------------------------------------------------------------
SUM: 3303 27162 65119 708414
-------------------------------------------------------------------------------

当然,如果你并不像我一样需要从 GitHub 上同步仓库,那你大可不需要使用我的脚本,只需要在你想要统计的目录下执行 cloc . 就好了

是不是还挺有意思的?
虽然知道这个数字没啥特别实质意义,但看着这些年自己写的几万行代码,有点像翻相册的感觉。


总结一下

  • cloc 是一个小巧但非常实用的代码行数统计工具;
  • 如果你的项目都放在 GitHub 上,可以配合 gh 做自动化统计;
  • 虽然代码行数并不重要,但偶尔看看还是挺开心的;

就当是一种和过去的自己打个招呼吧 ——
“嘿,我还在写代码,而且已经写了好多年了。”