#!/bin/bash # ============================================ # Git 批量管理脚本 - Bash 版本 # 适用于 Linux 和 Windows Git Bash # ============================================ # -------------------- 配置区 -------------------- # 父目录路径(支持相对路径和绝对路径) # 示例: # ".." -> 上级目录 # "." -> 当前目录 # "./projects" -> 当前目录下的 projects 文件夹 # "../projects" -> 上级目录下的 projects 文件夹 # "/home/user/projects" -> 绝对路径 # "$HOME/projects" -> 用户主目录下的 projects PARENT_DIR=".." # Git 远程仓库用户名 GIT_USERNAME="e2hang" # Git 远程仓库基础 URL GIT_BASE_URL="https://huajishe.fun/git" # 默认分支名 DEFAULT_BRANCH="main" # -------------------- 脚本主体 -------------------- # 颜色定义(可选,增强可读性) GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 检查父目录是否存在 if [ ! -d "$PARENT_DIR" ]; then echo -e "${RED}错误: 父目录 '$PARENT_DIR' 不存在${NC}" exit 1 fi echo -e "${BLUE}========================================${NC}" echo -e "${BLUE}开始处理目录: $PARENT_DIR${NC}" echo -e "${BLUE}========================================${NC}" echo "" # 统计变量 total=0 success=0 skipped=0 failed=0 # 遍历父目录下的所有一级子文件夹 for project_path in "$PARENT_DIR"/*/; do # 去除末尾的斜杠 project_path="${project_path%/}" # 跳过不是目录的项 if [ ! -d "$project_path" ]; then continue fi # 获取项目文件夹名称 project_name=$(basename "$project_path") # 计数 ((total++)) echo -e "${BLUE}[$total] 处理项目: $project_name${NC}" # 进入项目目录 cd "$project_path" || { echo -e "${RED} ✗ 无法进入目录${NC}" ((failed++)) continue } # 检查是否为 Git 仓库 if [ ! -d ".git" ]; then echo -e "${YELLOW} → 初始化 Git 仓库...${NC}" # 初始化 Git 仓库 if ! git init -b "$DEFAULT_BRANCH" >/dev/null 2>&1; then # 兼容旧版本 Git git init >/dev/null 2>&1 git checkout -b "$DEFAULT_BRANCH" >/dev/null 2>&1 fi # 设置远程仓库 remote_url="$GIT_BASE_URL/$GIT_USERNAME/${project_name}.git" git remote add origin "$remote_url" >/dev/null 2>&1 echo -e "${GREEN} ✓ 已初始化并设置远程仓库: $remote_url${NC}" fi # 检查是否有改动 if git diff --quiet && git diff --cached --quiet; then # 检查是否有未跟踪的文件 if [ -z "$(git ls-files --others --exclude-standard)" ]; then echo -e "${YELLOW} ○ 无改动,跳过${NC}" ((skipped++)) echo "" continue fi fi # 添加所有文件 echo -e "${YELLOW} → 添加文件...${NC}" git add . >/dev/null 2>&1 # 再次检查是否有需要提交的内容 if git diff --cached --quiet; then echo -e "${YELLOW} ○ 无需提交的改动,跳过${NC}" ((skipped++)) echo "" continue fi # 生成提交信息(包含当前时间) commit_msg="Auto commit at $(date '+%Y-%m-%d %H:%M:%S')" # 提交 echo -e "${YELLOW} → 提交更改...${NC}" if git commit -m "$commit_msg" >/dev/null 2>&1; then echo -e "${GREEN} ✓ 提交成功${NC}" # 推送到远程仓库 echo -e "${YELLOW} → 推送到远程仓库...${NC}" # 尝试推送,捕获错误 if git push -u origin "$DEFAULT_BRANCH" 2>&1 | grep -q "Everything up-to-date\|Successfully"; then echo -e "${GREEN} ✓ 推送成功${NC}" ((success++)) else # 推送失败,尝试普通推送 if git push 2>&1 | grep -q "Everything up-to-date\|Successfully"; then echo -e "${GREEN} ✓ 推送成功${NC}" ((success++)) else echo -e "${RED} ✗ 推送失败(可能需要先 pull 或检查远程仓库)${NC}" ((failed++)) fi fi else echo -e "${RED} ✗ 提交失败${NC}" ((failed++)) fi echo "" done # 输出统计信息 echo -e "${BLUE}========================================${NC}" echo -e "${BLUE}处理完成!${NC}" echo -e "${BLUE}========================================${NC}" echo -e "总计: $total 个项目" echo -e "${GREEN}成功: $success${NC}" echo -e "${YELLOW}跳过: $skipped${NC}" echo -e "${RED}失败: $failed${NC}" echo ""