将Git项目的所有远程分支打包成压缩包文件

创建文本文件package_all_branches_fixed.sh,输入以下脚本内容,修改项目名称、项目git地址,并保存。

bash 复制代码
#!/bin/bash

# === 需要修改的配置部分 ===
PROJECT_NAME="项目名称"
ORIGIN_REPO="项目git地址"
OUTPUT_DIR="branches_packages"

# === 脚本主体 ===
echo "=== 开始处理GitLab项目所有分支打包 ==="

# 记录当前目录
START_DIR=$(pwd)
echo "起始目录: $START_DIR"

# 创建输出目录
mkdir -p "$OUTPUT_DIR"
echo "创建输出目录: $OUTPUT_DIR"

# 1. 克隆原始仓库
echo "步骤1: 克隆原始仓库..."
git clone --mirror "$ORIGIN_REPO" "$PROJECT_NAME.git"

if [ $? -ne 0 ]; then
    echo "错误: 克隆仓库失败!"
    exit 1
fi

cd "$PROJECT_NAME.git"
MIRROR_DIR=$(pwd)
echo "已进入镜像仓库目录: $MIRROR_DIR"

# 2. 获取所有远程分支并创建本地跟踪分支
echo "步骤2: 设置所有分支..."
git branch -r | grep -v '\->' | while read remote; do 
    branch_name="${remote#origin/}"
    if [ "$branch_name" != "HEAD" ]; then
        git branch --track "$branch_name" "$remote" 2>/dev/null || echo "分支 $branch_name 已存在或创建失败"
    fi
done

# 3. 处理每个分支
echo "步骤3: 开始处理各个分支..."
git for-each-ref --format='%(refname:short)' refs/heads | while read branch_name; do
    echo "----------------------------------------"
    echo "正在处理分支: $branch_name"
    
    # 创建临时工作目录(使用绝对路径)
    temp_dir="$START_DIR/temp_${PROJECT_NAME}_${branch_name}"
    echo "临时目录: $temp_dir"
    
    # 如果目录已存在,先删除
    if [ -d "$temp_dir" ]; then
        echo " - 清理已存在的临时目录..."
        rm -rf "$temp_dir"
    fi
    
    # 使用git worktree将分支检出到临时目录
    echo " - 创建工作树..."
    git worktree add "$temp_dir" "$branch_name"
    
    if [ $? -ne 0 ]; then
        echo " - 错误: 创建工作树失败!"
        continue
    fi
    
    # 进入临时目录
    cd "$temp_dir"
    echo " - 当前目录: $(pwd)"
    
    # 移除.git文件夹(使其成为普通文件夹)
    echo " - 清理Git信息..."
    rm -rf .git
    
    # 创建压缩包 - 使用 tar 替代 zip
    echo " - 创建压缩包..."
    zip_file_name="${PROJECT_NAME}_${branch_name}.tar.gz"
    
    # 使用 tar 创建压缩包
    tar -czf "$START_DIR/$OUTPUT_DIR/$zip_file_name" .
    
    # 返回镜像仓库目录
    cd "$MIRROR_DIR"
    
    # 清理工作树
    echo " - 清理临时文件..."
    git worktree remove "$temp_dir" --force
    rm -rf "$temp_dir"
    
    # 检查压缩包是否创建成功
    if [ -f "$START_DIR/$OUTPUT_DIR/$zip_file_name" ]; then
        file_size=$(du -h "$START_DIR/$OUTPUT_DIR/$zip_file_name" | cut -f1)
        echo "✓ 完成: $zip_file_name (大小: $file_size)"
    else
        echo "✗ 失败: $branch_name 压缩包创建失败"
    fi
done

# 4. 最终清理
echo "----------------------------------------"
echo "步骤4: 清理工作..."
cd "$START_DIR"
rm -rf "$PROJECT_NAME.git"
git worktree prune

echo "=== 所有分支打包完成! ==="
echo "输出目录: $OUTPUT_DIR"
echo "生成的文件:"
ls -la "$OUTPUT_DIR/"

在package_all_branches_fixed.sh文件的根目录下,右键启用Git Bash Here工具(前提是安装了git工具),执行以下命令:

bash 复制代码
chmod +x package_all_branches_fixed.sh
./package_all_branches_fixed.sh

如果项目比较大,刚开始拉取项目的过程比较慢,拉取成功之后,后面打压缩包的过程就快了。

相关推荐
qq_4352879210 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
AIMath~17 小时前
Git 子模块(Submodule)目录结构清除实战复盘
git
切糕师学AI17 小时前
Ubuntu 下 Git 完全使用指南
linux·git·ubuntu
一袋米扛几楼9819 小时前
【Git】规范化协作:详解 GitHub 工作流中的 Issue、Branch 与 Pull Request 最佳实践
前端·git·github·issue
尘埃落定wf20 小时前
# GitHub CLI:告别繁琐的 Git 命令,让开发更高效
git·github
恋喵大鲤鱼20 小时前
git clone
git·git clone
金牛IT1 天前
Gogs 轻量级 Git 服务器搭建与使用
运维·服务器·git
Qres8211 天前
Git安装记录
git
wj3055853781 天前
Codex + Git 开发环境配置指南(WSL版)
linux·运维·git
楠枬2 天前
Git 分支管理
git