160 lines
4.7 KiB
Bash
160 lines
4.7 KiB
Bash
#!/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 "" |