#!/bin/bash # Backup individual de cada repo Gitea via mirror clone set -e git config --global --add safe.directory '*' 2>/dev/null DATE=$(date +%Y%m%d_%H%M%S) BACKUP_DIR="/tmp/backup-git-repos" DEST="gdrive:Git/repos" GITEA_DATA="/var/lib/docker/volumes/yccsckck4g004gosccwc4kg4_gitea-data/_data/git/repositories" echo "[$(date)] Backup repos Git started" rm -rf "$BACKUP_DIR" mkdir -p "$BACKUP_DIR" # Find all bare repos (*.git directories) REPOS=$(find "$GITEA_DATA" -maxdepth 2 -name "*.git" -type d 2>/dev/null) COUNT=0 SKIPPED=0 for REPO_PATH in $REPOS; do # Extract owner and repo name from path REL_PATH="${REPO_PATH#$GITEA_DATA/}" OWNER=$(dirname "$REL_PATH") REPO_NAME=$(basename "$REPO_PATH" .git) # Skip non-repo directories (keys, lfs, etc) if [[ "$OWNER" == "." ]] || [[ "$OWNER" == "keys" ]] || [[ "$OWNER" == "lfs" ]]; then continue fi # Check if repo has any commits (non-empty) COMMITS=$(git -C "$REPO_PATH" rev-list --count HEAD 2>/dev/null || echo "0") if [[ "$COMMITS" == "0" ]]; then echo "Skipping empty: $OWNER/$REPO_NAME" SKIPPED=$((SKIPPED + 1)) continue fi # Create directory structure mkdir -p "$BACKUP_DIR/$OWNER" # Mirror clone to a .git file echo "Backing up: $OWNER/$REPO_NAME ($COMMITS commits)" git clone --mirror "$REPO_PATH" "$BACKUP_DIR/$OWNER/${REPO_NAME}.git" 2>/dev/null # Compress tar -czf "$BACKUP_DIR/$OWNER/${REPO_NAME}.git.tar.gz" -C "$BACKUP_DIR/$OWNER" "${REPO_NAME}.git" 2>/dev/null rm -rf "$BACKUP_DIR/$OWNER/${REPO_NAME}.git" COUNT=$((COUNT + 1)) done echo "Backed up $COUNT repos ($SKIPPED empty skipped)" # Sync to Google Drive rclone copy "$BACKUP_DIR" "$DEST" --progress # Keep only last 7 days in GDrive rclone delete "$DEST" --min-age 7d # Cleanup local rm -rf "$BACKUP_DIR" echo "[$(date)] Backup repos Git finished"