背景
在往自己使用 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 视图 |
|---|---|
![]() |
![]() |

