如何提升Git暂存文件大小检查脚本的执行效率?
优化暂存文件大小检查脚本的性能方案
原始脚本的核心性能瓶颈是循环中反复调用git cat-file启动子进程,以及一些不必要的冗余操作。以下是针对性的优化方法:
1. 批量获取文件大小,减少Git调用次数
每次调用Git命令都会启动一个独立子进程,当文件数量较多时,这会带来巨大的性能开销。改用git cat-file --batch批量处理所有暂存文件的大小查询,将Git调用次数从N次(N为文件数)压缩到2次:
result=0 max_limit_mb=$(( max_allowed_packed_size / 1048576 )) # 批量提取暂存区文件的SHA和路径,再批量查询大小 git diff-index --ignore-submodules=all --cached --diff-filter=ACMRTUXB --raw HEAD | while IFS=$'\t' read -r _ mode _ sha1 _ path; do # 仅处理普通文件(排除目录、符号链接等非文件类型) if [[ $mode == 100644 || $mode == 100755 ]]; then echo "$sha1 $path" fi done | git cat-file --batch-check="%(objectsize) %(rest)" | while read -r file_size path; do if (( file_size > max_allowed_packed_size )); then echo "File $path is $(( file_size / 1048576 )) MB after compressing, which is larger than our configured limit of $max_limit_mb MB." result=1 fi done exit $result
2. 移除不必要的操作
- 删除循环中的
echo $file:如果不是调试需求,该输出会增加IO开销,完全可以移除。 - 去掉
[[ -f "$file" ]]检查:git diff-index --cached配合--diff-filter=ACMRTUXB返回的都是暂存区中存在的有效文件,无需额外验证文件存在性。
3. 优化算术运算与变量复用
- 提前计算限制的MB值:脚本开头一次性算出
max_limit_mb,避免在循环中重复计算$(( max_allowed_packed_size / 2**20 ))。 - 用固定值
1048576替代2**20:bash中幂次计算虽开销不大,但直接使用常量更直观且略高效。
额外建议:提前终止检查(可选)
如果只需发现一个超大文件就终止检查(无需找出所有违规文件),可以在发现第一个违规文件后立即退出循环,进一步节省时间:
# 在批量处理的循环中添加break逻辑 git cat-file --batch-check="%(objectsize) %(rest)" | while read -r file_size path; do if (( file_size > max_allowed_packed_size )); then echo "File $path is $(( file_size / 1048576 )) MB after compressing, which is larger than our configured limit of $max_limit_mb MB." result=1 break fi done
内容的提问来源于stack exchange,提问作者ysief-001
相关产品推荐
相关产品推荐

