Skip to content

是的,这种写法可以通用于绝大多数 Git 仓库,用于生成“仓库从空到当前HEAD的完整diff”,包括首个提交的内容
核心逻辑是:

  1. git commit-tree 手工制造一个“空树的虚拟根提交”,赋值给变量 deadbeef
  2. git diff <虚拟根> HEAD,一次性输出完整变更

完整可复用脚本如下:

bash
#!/bin/bash
# Usage: ./full_repo_diff.sh [<target-branch-or-commit>] [<path>]
# 默认对比 HEAD,可选限定路径(如 src)
set -e

target=${1:-HEAD}
path=${2:-}

root=$(git commit-tree $(git hash-object -t tree /dev/null) -m "Synthetic root")
if [ -n "$path" ]; then
  git diff $root $target -- $path
else
  git diff $root $target
fi

说明:

  • 通用性好,无需关心首个提交的hash
  • 不更改仓库历史,无副作用
  • 可加参数限定到某个目录(如src)
  • 适合 review、代码审计等场景

注意事项:

  • 这个“虚拟根提交”不在实际分支历史,只用于 diff,不会污染仓库
  • 不适用于历史有 graft/filter/rewritten 情况的特殊仓库(极少见)

结论:
这种脚本可作为通用方案,适用于绝大多数标准 git 仓库,优雅高效。

基于 MIT 许可证发布。