Skip to content

Instantly share code, notes, and snippets.

@jdecool
Created April 19, 2026 14:04
Show Gist options
  • Select an option

  • Save jdecool/43cc3ce5b584c042816da2aeda799d8b to your computer and use it in GitHub Desktop.

Select an option

Save jdecool/43cc3ce5b584c042816da2aeda799d8b to your computer and use it in GitHub Desktop.
Github backup script
#!/bin/bash
# Dossier où cloner/mettre à jour les repos (par défaut: ./repos)
TARGET_DIR="${1:-./repos}"
mkdir -p "$TARGET_DIR" || { echo "Erreur: impossible de créer $TARGET_DIR"; exit 1; }
# Fichier CSV pour les métadonnées
METADATA_FILE="$TARGET_DIR/metadata_repos.csv"
echo "Nom;URL;Visibilité;Archivé;Description;Étoiles;Forks;Dernière mise à jour" > "$METADATA_FILE"
# Fonction pour cloner ou mettre à jour un repo et enregistrer ses métadonnées
clone_or_update_and_record() {
local repo_full_name="$1"
local repo_url="git@github.com:$repo_full_name.git"
local repo_name=$(basename "$repo_full_name")
local metadata
# Récupérer les métadonnées via gh api
metadata=$(gh api "repos/$repo_full_name" 2>/dev/null)
if [ -z "$metadata" ]; then
echo "Impossible de récupérer les métadonnées pour $repo_full_name"
return
fi
# Extraire les infos
local visibility=$(echo "$metadata" | jq -r '.private | if . then "privé" else "public" end')
local archived=$(echo "$metadata" | jq -r '.archived | if . then "oui" else "non" end')
local description=$(echo "$metadata" | jq -r '.description // ""')
local stars=$(echo "$metadata" | jq -r '.stargazers_count')
local forks=$(echo "$metadata" | jq -r '.forks_count')
local updated_at=$(echo "$metadata" | jq -r '.updated_at')
# Écrire dans le fichier CSV
echo "$repo_name;$repo_url;$visibility;$archived;$description;$stars;$forks;$updated_at" >> "$METADATA_FILE"
# Cloner ou mettre à jour le repo
if [ -d "$TARGET_DIR/$repo_name" ]; then
echo "Le repo $repo_name existe déjà, mise à jour en cours..."
(cd "$TARGET_DIR/$repo_name" && git pull) || echo "Erreur lors de la mise à jour de $repo_name"
else
echo "Clonage de $repo_name..."
git clone --depth 1 "$repo_url" "$TARGET_DIR/$repo_name" || echo "Erreur lors du clonage de $repo_name"
fi
}
# Lister tous les repos accessibles avec gh
echo "Récupération de la liste des repos..."
gh repo list --limit 1000 | while read -r line; do
repo_full_name=$(echo "$line" | awk '{print $1}')
if [ -n "$repo_full_name" ]; then
clone_or_update_and_record "$repo_full_name"
fi
done
echo "Traitement terminé dans $TARGET_DIR"
echo "Les métadonnées (incluant le statut 'archivé') ont été enregistrées dans $METADATA_FILE"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment