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

背景

在往自己使用 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 仓库根目录
  • 在仓库根目录内右键鼠标,选择:Open Git Bash Here
  • 在 gitbash 执行:bash split_commit.sh "Assets/ArchVizPRO Interior Vol.6" "提交 ArchVizPRO Interior Vol.6"

注意事项

  • Assets/ArchVizPRO Interior Vol.6换成你需要处理的路径;
  • 提交 ArchVizPRO Interior Vol.6换成你希望展示的 commit message
  • 实际使用中可能遗漏少量文件自行手动提交就行

效果预览

git bash 视图 GitHub desktop 视图
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容