DEV Community

Cover image for Copia de seguridad y sincronización automática de todos los repositorios de una cuenta u organización Git
Ivaj O'Franc
Ivaj O'Franc

Posted on • Edited on • Originally published at dev.to

Copia de seguridad y sincronización automática de todos los repositorios de una cuenta u organización Git

id: 2763188 title: "Copia de seguridad y sincronización automática de todos los repositorios de una cuenta u organización Git" published: true tags: [git, github, bash, automatizacion] series: Lo Arreglé y No Sé Cómo description: "Copia de seguridad y sincronización automática de todos los repositorios de una cuenta u..." canonical_url: "https://dev.to/ivajofranc/copia-de-seguridad-y-sincronizacion-automatica-de-todos-los-repositorios-de-una-cuenta-u-cj" cover_image: "https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgrorsebd4936cvl1dz7f.png" 
Enter fullscreen mode Exit fullscreen mode

Copia de seguridad y sincronización automática de todos los repositorios de una cuenta u organización Git

🇬🇧 Also read this post in English

En este tutorial te cuento cómo cloné y mantuve sincronizados todos los repositorios de una cuenta/organización GitHub, pero que también funciona para GitLab, Bitbucket o cualquier servidor Git que exponga una API y soporte git clone y git pull.

🎯 Objetivo

  • Descargar todos los repositorios (públicos y privados) de una cuenta/organización.
  • Guardarlos en una carpeta local (opcionalmente sincronizada con OneDrive, Dropbox, etc.).
  • Actualizarlos con un solo comando (git pull en cada uno).
  • Registrar todo en un archivo de log para auditoría.

🛠️ Entorno usado

  • SO: Windows 10/11
  • Terminal: Git Bash (incluido con Git para Windows)
  • Herramientas necesarias:

🔑 Pasos realizados y aprendizajes

1️⃣ Creación del token de acceso

  • Crear un Personal Access Token (PAT) en GitHub con permisos:
    • repo (para repos privados)
    • read:org (para organizaciones)

Problema: usar el endpoint de organización en una cuenta de usuario devolvía 404 Not Found.

Solución: diferenciar entre usuario (/users/usuario/repos) y organización (/orgs/org/repos).

2️⃣ Script inicial de clonado

ORG_NAME="Organizacion-Ejemplo" OUTPUT_DIR="." REPOS_FILE="$OUTPUT_DIR/repos.txt" GITHUB_TOKEN="TOKEN_AQUI" mkdir -p "$OUTPUT_DIR" cd "$OUTPUT_DIR" || exit 1 curl -s -H "Authorization: token $GITHUB_TOKEN" "https://api.github.com/orgs/$ORG_NAME/repos?per_page=100&type=all" | jq -r '.[].clone_url' > "$REPOS_FILE" while read -r repo_url; do git clone "$repo_url" done < "$REPOS_FILE" 
Enter fullscreen mode Exit fullscreen mode

✅ Funciona para clonar todos los repos.

❌ Falla al repetir ejecución: fatal: destination path already exists.

3️⃣ Mejora para sincronizar (git pull)

repo_name=$(basename "$repo_url" .git) if [ -d "$repo_name/.git" ]; then git -C "$repo_name" pull else git clone "$repo_url" fi 
Enter fullscreen mode Exit fullscreen mode

✅ Actualiza si ya existe.

❌ Falla si nombre de carpeta ≠ nombre repo (mayúsculas/minúsculas).

4️⃣ Solución robusta

if [ -d "$repo_name/.git" ]; then (cd "$repo_name" && git pull) elif [ -d "$repo_name" ]; then echo "⚠️ Carpeta $repo_name existe pero no es repo Git" else git clone "$repo_url" fi 
Enter fullscreen mode Exit fullscreen mode

✅ Actualiza correctamente todos los repos existentes.

5️⃣ Registro en log

LOG_FILE="$(pwd)/sync-repos.log" echo "$(date) - Iniciando sincronización" | tee -a "$LOG_FILE" while read -r repo_url; do repo_name=$(basename "$repo_url" .git) if [ -d "$repo_name/.git" ]; then echo "📥 Actualizando $repo_name" | tee -a "$LOG_FILE" (cd "$repo_name" && git pull >> "$LOG_FILE" 2>&1) else echo "📦 Clonando $repo_name" | tee -a "$LOG_FILE" git clone "$repo_url" >> "$LOG_FILE" 2>&1 fi done < "$REPOS_FILE" echo "$(date) - Finalizado" | tee -a "$LOG_FILE" 
Enter fullscreen mode Exit fullscreen mode

📂 Ubicación de las copias

  • OUTPUT_DIR="." → se guarda en la carpeta actual.
  • Ubicación fija en Windows + Git Bash:
 OUTPUT_DIR=/c/Users/usuario/OneDrive/Backups/github 
Enter fullscreen mode Exit fullscreen mode

🔄 Adaptar para GitLab o Bitbucket

  • GitLab: https://gitlab.com/api/v4/groups/<grupo>/projects
  • Bitbucket: https://api.bitbucket.org/2.0/repositories/<usuario>
  • Ajustar autenticación (Bearer token, Basic Auth, etc.).

💡 Recomendaciones finales

  • Probar primero en carpeta de pruebas.
  • Evitar espacios en rutas o escaparlos con \.
  • Controlar errores de red con set -e o validaciones.
  • Programar ejecución con Task Scheduler (Windows) o cron (Linux).
  • Respaldar logs para histórico.

📌 Enlaces de interés

Top comments (0)