| #!/bin/bash |
| |
| |
| |
| |
|
|
| 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 |
|
|