代码考古:用 gitcharts 挖掘 Git 仓库的演变轨迹

运行了几个项目,效果如下

gitcharts 01 gitcharts 02 gitcharts 03 gitcharts 04

不同颜色代表不同时期的代码,可以看到项目是否频繁重构。

注意本篇非严肃性技术文章,仓库作者的项目(koaning/gitcharts)可能会随时有破坏性改动,当前的脚本也仅适用于在本地项目根目录中执行,如遇报错建议使用 AI 进行评估和校正。

安装 koaning/gitcharts

$ mkdir -p ~/Portable/gitcharts && cd ~/Portable/gitcharts

$ git clone https://github.com/koaning/gitcharts.git gitcharts-viewer

创建一个便捷脚本并添加到 PATH

$ mkdir -p ~/Portable/bin

$ cat > ~/Portable/bin/git-archaeology <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
uv run --python 3 "$HOME/Portable/gitcharts/gitcharts-viewer/git_archaeology.py" "$@"
EOF

$ chmod +x ~/Portable/bin/git-archaeology


# 加到 Path
$ echo 'export PATH="$HOME/Portable/bin:$PATH"' >> ~/.zshrc

$ source ~/.zshrc

之后就可以使用

$ git-archaeology --repo . --samples 80 --file-extensions .md,.js,.mjs,.py,.html,.css,.rst,.go --version-source none

当然这仍然比较麻烦,运行后像查看数据、清理仓库中的临时文件和产出

再创建一个脚本

$ cat > ~/Portable/bin/gitcharts-add <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

repo_name="${1:-$(basename "$PWD")}"
viewer_dir="$HOME/Portable/gitcharts/gitcharts-viewer"
viewer_charts="$viewer_dir/charts"

git-archaeology \
  --repo . \
  --samples 80 \
  --file-extensions .md,.js,.mjs,.py,.html,.css,.rst,.go \
  --version-source none

mkdir -p "$viewer_charts"
cp charts/.-clean.json "$viewer_charts/${repo_name}-clean.json"

if [ -f charts/.-versioned.json ]; then
  cp charts/.-versioned.json "$viewer_charts/${repo_name}-versioned.json"
fi

cd "$viewer_dir"
uv run --python 3 --with jsonschema generate_repos_list.py

cd "$OLDPWD"
rm -rf .downloads charts git-research
EOF

添加为可执行文件

chmod +x ~/Portable/bin/gitcharts-add

之后,在Git 项目根目录下运行 gitcharts-add 命令即可自动生成和清理

# 执行
$ gitcharts-add

# 或者可以执行
$ gitcharts-add my-repo

每次运行,生成的数据 JSON 被同步到了以下目录

~/Portable/gitcharts/gitcharts-viewer/charts

查看图表

cd ~/Portable/gitcharts/gitcharts-viewer

uv run --python 3 -m http.server 8100

浏览器访问:http://127.0.0.1:8100