如何编写Bash脚本生成Git提交的内容哈希(非提交哈希)
Git提交内容哈希生成脚本(纯Bash)
脚本特性
- 仅对Git追踪的文件(含新增/删除)计算哈希,未追踪文件完全不影响
- 与提交哈希、提交历史无关,内容一致的提交会生成相同哈希
- 无需检出目标提交,可直接指定任意历史提交(如分支名、commit ID、HEAD等)
- 使用SHA-256算法,碰撞概率极低
- 纯Bash实现,无额外依赖
脚本代码
#!/usr/bin/env bash # 默认使用当前HEAD,若传入参数则使用指定提交 COMMIT="${1:-HEAD}" # 验证提交是否合法 if ! git rev-parse --verify "$COMMIT" >/dev/null 2>&1; then echo "错误:提交 $COMMIT 不存在或无法访问" >&2 exit 1 fi # 生成内容哈希: # 1. 列出提交下所有追踪的文件(递归),包含blob哈希和完整路径 # 2. 按文件路径排序,避免因文件顺序导致哈希差异 # 3. 对排序后的内容计算SHA-256哈希 git ls-tree -r --full-name --long "$COMMIT" \ | awk '{print $3, $4}' \ | sort -k2 \ | sha256sum \ | awk '{print $1}'
使用方法
- 生成当前HEAD的内容哈希:
./commit-content-hash.sh - 生成指定提交的内容哈希:
./commit-content-hash.sh <提交标识>,例如:- 分支:
./commit-content-hash.sh develop - 提交ID:
./commit-content-hash.sh abc123
- 分支:
逻辑说明
git ls-tree -r --full-name --long:递归列出目标提交下所有Git追踪文件的blob哈希与完整路径,确保路径以仓库根目录为基准,消除路径差异影响awk '{print $3, $4}':提取关键信息,过滤文件权限、大小等无关字段sort -k2:按文件名排序,保证文件顺序不会改变最终哈希值sha256sum:对标准化后的内容计算SHA-256哈希,确保碰撞风险极低
内容的提问来源于stack exchange,提问作者Brondahl
相关产品推荐
相关产品推荐

