为什么要做这件事?

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

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

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

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

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

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


发现了一个小工具:cloc

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

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

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

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

-------------------------------------------------------------------------------
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):

brew install gh jq cloc git

Ubuntu / Debian 安装方法:

sudo apt update
sudo apt install gh jq cloc git

Windows 安装方法(建议用 WSL)

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

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

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

  3. 安装依赖:

    sudo apt update
    sudo apt install gh jq cloc git
    

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

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

gh auth login

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


脚本源码(可以直接用)

#!/bin/bashUSERNAME="zxc7563598"   # 👈 改成你的 GitHub 用户名
WORKDIR="$HOME/github_repos"# 创建存放仓库的目录
mkdir -p "$WORKDIR"
cd "$WORKDIR" || exitecho "📥 正在获取 $USERNAME 的所有仓库..."# 获取所有仓库的 HTTPS 地址(最多 200 个,可改成 1000)
gh repo list $USERNAME --limit 200 --json nameWithOwner,url \| jq -r '.[].url' | while read repo; doreponame=$(basename "$repo")if [ -d "$reponame" ]; thenecho "🔄 更新仓库: $reponame"cd "$reponame" && git pull --quiet && cd ..elseecho "⬇️ 克隆仓库: $reponame"git clone --depth=1 "$repo" --quietfi
doneecho ""
echo "📊 开始统计代码行数(排除 node_modules、vendor、dist、build、public)..."
echo ""cloc --exclude-dir=node_modules,vendor,dist,build,public --exclude-lang=JSON .

运行结果展示

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

-------------------------------------------------------------------------------
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 做自动化统计;
  • 虽然代码行数并不重要,但偶尔看看还是挺开心的;

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