Files
workspace/bash/git-upload-linux.sh
2026-03-15 13:14:04 +08:00

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 ""