适用于 Git Bash 的脚本,批量提交和推送多个仓库的修改
·
创建批量脚本文件
#!/bin/bash
# batch_git_ops.sh - 批量提交和推送所有Git仓库的修改
echo "🚀 Git Bash 批量提交和推送工具"
echo "======================================"
# 设置颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 计数器
success_count=0
fail_count=0
no_changes_count=0
# 询问是否使用相同的提交信息
read -p "🔤 是否对所有仓库使用相同的提交信息? (y/n): " use_same_msg
if [[ $use_same_msg =~ ^[Yy]$ ]]; then
read -p "📝 请输入提交信息: " commit_message
if [ -z "$commit_message" ]; then
commit_message="批量更新: $(date '+%Y-%m-%d %H:%M:%S')"
fi
fi
echo ""
echo "🔍 开始扫描当前目录下的Git仓库..."
echo ""
# 遍历当前目录下的所有子目录
for dir in */; do
# 移除末尾的斜杠
dir=${dir%*/}
if [ -d "$dir/.git" ]; then
echo "======================================"
echo "📁 仓库: $dir"
echo "======================================"
# 进入目录
cd "$dir" || continue
# 检查当前分支
current_branch=$(git rev-parse --abbrev-ref HEAD)
echo "🌿 当前分支: $current_branch"
# 检查是否有未提交的更改
if [ -n "$(git status --porcelain)" ]; then
echo "📄 发现未提交的更改:"
git status -s
# 获取提交信息
if [[ ! $use_same_msg =~ ^[Yy]$ ]]; then
echo ""
read -p "📝 为仓库 '$dir' 输入提交信息 (留空跳过此仓库): " repo_commit_message
if [ -z "$repo_commit_message" ]; then
echo "⏭️ 跳过仓库 '$dir'"
cd ..
continue
fi
else
repo_commit_message="$commit_message"
fi
# 添加所有更改
echo "➕ 添加所有更改到暂存区..."
git add .
# 提交更改
echo "💾 提交更改..."
if git commit -m "$repo_commit_message"; then
echo "${GREEN}✅ 提交成功${NC}"
else
echo "${RED}❌ 提交失败${NC}"
cd ..
fail_count=$((fail_count + 1))
continue
fi
# 推送更改
echo "📤 推送到远程仓库..."
if git push; then
echo "${GREEN}✅ 推送成功${NC}"
success_count=$((success_count + 1))
else
echo "${YELLOW}⚠️ 推送失败,尝试设置上游分支...${NC}"
if git push --set-upstream origin "$current_branch"; then
echo "${GREEN}✅ 推送成功${NC}"
success_count=$((success_count + 1))
else
echo "${RED}❌ 推送失败${NC}"
fail_count=$((fail_count + 1))
fi
fi
else
echo "${BLUE}📭 没有未提交的更改${NC}"
no_changes_count=$((no_changes_count + 1))
fi
# 返回上级目录
cd ..
echo ""
else
echo "${BLUE}➖ 跳过: $dir (不是Git仓库)${NC}"
fi
done
echo "======================================"
echo "📊 批量操作完成!"
echo "======================================"
echo "${GREEN}✅ 成功: $success_count 个仓库${NC}"
echo "${BLUE}📭 无更改: $no_changes_count 个仓库${NC}"
echo "${RED}❌ 失败: $fail_count 个仓库${NC}"
# 如果没有任何Git仓库
if [ $((success_count + no_changes_count + fail_count)) -eq 0 ]; then
echo ""
echo "ℹ️ 提示: 当前目录下没有找到Git仓库"
echo " 请将脚本放在包含Git仓库的目录中运行"
fi
使用方法
- 保存脚本文件
# 打开Git Bash,创建脚本文件
touch batch_git.sh
2.赋予执行权限
chmod +x batch_git.sh
3.赋予执行权限
chmod +x batch_git.sh
4.运行脚本
# 进入包含多个Git仓库的目录
cd /path/to/your/repos
# 运行脚本
./batch_git.sh
要在一个包含多个仓库的文件夹中批量拉取所有仓库的最新代码
方法1:一行命令(在 Git Bash 中执行)
for dir in */; do if [ -d "$dir/.git" ]; then echo "拉取: $dir"; cd "$dir"; git pull; cd ..; fi; done
方法2:创建脚本文件 batch_pull.sh
#!/bin/bash
echo "🚀 批量拉取所有Git仓库"
for dir in */; do
dir=${dir%*/}
if [ -d "$dir/.git" ]; then
echo "======================================"
echo "📁 仓库: $dir"
echo "======================================"
cd "$dir"
git pull
cd ..
echo ""
fi
done
echo "✅ 所有仓库拉取完成!"
使用步骤:
将脚本保存为 batch_pull.sh
赋予执行权限:chmod +x batch_pull.sh
运行:./batch_pull.sh
方法3:带进度的增强版本
#!/bin/bash
echo "🚀 批量拉取所有Git仓库"
echo "======================================"
count=0
success=0
fail=0
for dir in */; do
dir=${dir%*/}
if [ -d "$dir/.git" ]; then
count=$((count + 1))
echo "[$count] 📁 仓库: $dir"
cd "$dir"
if git pull; then
echo " ✅ 拉取成功"
success=$((success + 1))
else
echo " ❌ 拉取失败"
fail=$((fail + 1))
fi
cd ..
echo ""
fi
done
echo "======================================"
echo "📊 统计:共 $count 个仓库,成功 $success,失败 $fail"
方法4:如果只想拉取特定分支
for dir in */; do
if [ -d "$dir/.git" ]; then
cd "$dir"
git pull origin main # 将 main 改为你想要的分支名
cd ..
fi
done
sync_all.sh-多仓库代码同步
#!/bin/bash
# ---------- 函数定义(必须在使用前) ----------
# 执行 rebase,智能处理冲突
do_rebase() {
git pull --rebase
local ret=$?
while [ $ret -ne 0 ]; do
echo ""
echo "⚠️ 仓库 $(basename "$(pwd)") 出现冲突!"
echo ""
echo "请选择处理方式:"
echo " [1] 使用 git mergetool 图形化解冲突(需已配置合并工具)"
echo " [2] 手动编辑冲突文件后继续"
read -p "请输入 1 或 2(默认 2):" choice
if [ "$choice" = "1" ]; then
git mergetool
if [ $? -ne 0 ]; then
echo "mergetool 启动失败,请手动解决冲突。"
read -p "冲突解决完成后按 Enter 键继续..."
fi
git add -A
git rebase --continue
else
echo ""
echo "请手动编辑冲突文件(搜索 <<<<<<< 标记)"
echo "编辑完成后,执行:"
echo " git add <文件名>"
echo " git rebase --continue"
read -p "冲突解决完成后按 Enter 键继续..."
git add -A
git rebase --continue
fi
ret=$?
done
}
# 执行 stash pop,智能处理冲突
do_stash_pop() {
git stash pop
local ret=$?
while [ $ret -ne 0 ]; do
echo ""
echo "⚠️ stash pop 出现冲突!"
read -p "使用 mergetool 解冲突吗?(y/n,默认 n):" choice
if [ "$choice" = "y" ] || [ "$choice" = "Y" ]; then
git mergetool
git add -A
git stash drop
else
echo "请手动编辑冲突文件,然后执行:"
echo " git add <文件名>"
echo " git stash drop"
read -p "冲突解决完成后按 Enter 键继续..."
git add -A
git stash drop
fi
ret=$?
done
}
# ---------- 主程序 ----------
# 切换到脚本所在目录
cd "$(dirname "$0")" || exit
echo "当前工作目录:$(pwd)"
echo "开始同步所有仓库..."
echo ""
# 遍历所有子目录
for dir in */; do
# 跳过名为 HansPanelFrame 的目录
if [[ "$dir" == "HansPanelFrame/" ]]; then
continue
fi
# 检查是否为 Git 仓库
if [ -d "${dir}.git" ]; then
echo "=== 正在处理仓库:${dir%/} ==="
cd "$dir" || continue
# 1. 暂存本地改动
git stash push -u -m "auto-stash" > /dev/null 2>&1
# 2. 执行 rebase 并处理冲突
do_rebase
# 3. 恢复 stash 并处理冲突
do_stash_pop
cd ..
echo ""
fi
done
echo "==========================================="
echo "所有仓库同步完成!"
echo "==========================================="
read -p "按 Enter 键退出..."
exit 0
使用方法
1.将脚本放到目标父目录
2.cd该目录或者右键 → Git Bash Here
3.赋予权限,
chmod +x sync_all.sh
4.运行
./sync_all.sh
Git Bash(或任何 Unix shell)中,返回上一级目录的最快方法是
..代表上一级目录(父目录)
•
连续返回多级:cd ../..返回上两级,以此类推
•
快速回到上一次的目录:cd -
注意事项
1.确保已配置SSH密钥,避免每次推送都要输入密码;
2.首次运行前建议先在单个仓库测试脚本;
3.脚本会提交所有更改,包括新文件、修改和删除;
4.如果有合并冲突,脚本可能会失败,需要手动处理;
5.建议定期备份重要数据。
更多推荐




所有评论(0)