创建批量脚本文件

#!/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

使用方法

  1. 保存脚本文件
# 打开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.建议定期备份重要数据。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐