#!/bin/bash # 管理子目录中的 .git 文件夹:备份、删除、恢复 # 用法: # ./manage_subgits.sh backup - 备份并删除子目录中的 .git # ./manage_subgits.sh restore - 从备份中恢复 .git set -euo pipefail cd "$(dirname "$0")" BACKUP_DIR=".git_backups" MANIFEST="$BACKUP_DIR/manifest.txt" backup() { if [ -d "$BACKUP_DIR" ]; then echo "❌ 备份目录 $BACKUP_DIR 已存在,请先 restore 或手动删除" exit 1 fi mkdir -p "$BACKUP_DIR" > "$MANIFEST" count=0 while IFS= read -r gitdir; do count=$((count + 1)) echo "$count|$gitdir" >> "$MANIFEST" echo "📦 备份: $gitdir" cp -a "$gitdir" "$BACKUP_DIR/$count" echo "🗑️ 删除: $gitdir" rm -rf "$gitdir" done < <(find . -mindepth 2 -name ".git" -not -path "./$BACKUP_DIR/*" | sort) if [ "$count" -eq 0 ]; then rm -rf "$BACKUP_DIR" echo "ℹ️ 没有找到子目录中的 .git,无需操作" else echo "" echo "✅ 完成!共备份并删除了 $count 个 .git" echo "📁 备份存放在: $BACKUP_DIR/" echo "👉 上传完成后运行: $0 restore" fi } restore() { if [ ! -f "$MANIFEST" ]; then echo "❌ 找不到备份清单 $MANIFEST,没有可恢复的内容" exit 1 fi count=0 while IFS='|' read -r id gitdir; do if [ ! -d "$BACKUP_DIR/$id" ]; then echo "⚠️ 跳过: 备份 #$id 不存在 ($gitdir)" continue fi mkdir -p "$(dirname "$gitdir")" echo "♻️ 恢复: $gitdir" cp -a "$BACKUP_DIR/$id" "$gitdir" count=$((count + 1)) done < "$MANIFEST" rm -rf "$BACKUP_DIR" echo "" echo "✅ 完成!共恢复了 $count 个 .git" echo "🧹 备份目录已清理" } case "${1:-}" in backup) backup ;; restore) restore ;; *) echo "用法: $0 {backup|restore}" echo "" echo " backup - 备份子目录中所有 .git 并删除它们" echo " restore - 从备份中恢复所有 .git" exit 1 ;; esac