Hanrui / manage_subgits.sh
Lekr0's picture
Add files using upload-large-folder tool
40d87dd verified
#!/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