使用 gitbash 脚本分段提交文件,避免 push 失败

2025-10-11  本文已影响0人  雨落随风

背景

在往自己使用 gitlab 搭建的git 服务器通过 git push 推送某些项目时,发现推送失败,提示 “The requested URL returned error: 500” ;通过分批次提交可以解决此问题

实现

通过 git GUI 工具人工分批提交很显然并不可取,于是撰写 gitbash 脚本实现分批提交:

#!/bin/bash
set -euo pipefail

TARGET_FOLDER="$1"
COMMIT_MESSAGE="$2"
DRY_RUN="${3:-false}"
MAX_SIZE_MB=500

echo "======================"
echo "目标文件夹:$TARGET_FOLDER"
echo "提交信息:$COMMIT_MESSAGE"
echo "Dry Run 模式:$DRY_RUN"
echo "======================"

# 获取所有文件(含路径)
mapfile -t FILES < <(find "$TARGET_FOLDER" -type f)
TOTAL_FILES=${#FILES[@]}

echo ""
echo "正在扫描文件夹:$TARGET_FOLDER ..."
echo "共找到 $TOTAL_FILES 个文件。"

# 统计并分组
echo ""
echo "按每组 ${MAX_SIZE_MB}MB 划分提交..."
GROUP_SIZE=$((MAX_SIZE_MB * 1024 * 1024))
CURRENT_GROUP_SIZE=0
GROUP_INDEX=1
GROUP_FILES=()

commit_group() {
    if [ ${#GROUP_FILES[@]} -eq 0 ]; then return; fi

    echo "----------------------------------------"
    echo "第 $GROUP_INDEX 组,共 ${#GROUP_FILES[@]} 个文件"

    for file in "${GROUP_FILES[@]}"; do
        if git check-ignore -q "$file"; then
            echo "忽略文件: $file"
        else
            if [ "$DRY_RUN" = true ]; then
                echo "[DryRun] git add \"$file\""
            else
                git add "$file"
            fi
        fi
    done

    if [ "$DRY_RUN" = false ]; then
        if git diff --cached --quiet; then
            echo "⚠️ 无可提交更改,跳过第 $GROUP_INDEX 组。"
        else
            git commit -m "${COMMIT_MESSAGE} (Part $GROUP_INDEX)"
        fi
    fi

    ((GROUP_INDEX++))
    GROUP_FILES=()
    CURRENT_GROUP_SIZE=0
}

for file in "${FILES[@]}"; do
    FILE_SIZE=$(stat -c%s "$file" 2>/dev/null || echo 0)
    # 判断是否超出当前组容量
    if (( CURRENT_GROUP_SIZE + FILE_SIZE > GROUP_SIZE )); then
        commit_group
    fi
    GROUP_FILES+=("$file")
    ((CURRENT_GROUP_SIZE += FILE_SIZE))
done

# 提交最后一组
commit_group

echo "----------------------------------------"
echo "✅ 所有分组提交完成(不包含 push)。"

功能特性

功能 说明
无崩溃风险 每个文件单独执行 git add,不会触发 Argument list too long
自动分组 按 500 MB 拆分,每组自动提交
自定义提交信息 第二个参数定义前缀,如 "提交 ArchVizPRO Interior Vol.6"
Dry Run 模式 第三个参数设为 true 仅预览不执行
兼容 Windows Git Bash 过滤 CRLF、路径安全、空格兼容

使用方法

注意事项

效果预览

git bash 视图 GitHub desktop 视图
上一篇 下一篇

猜你喜欢

热点阅读