ghorg, pour sauvegarder tous tes dépôts git

ghorg est un logiciel en ligne de commande pour automatiser la copie de dépôts git. Il permet de cloner tous les dépôts d’un compte ou d’un groupe sur les plateformes GitHub, GitLab, Bitbucket ou Gitea en utilisant leur API.

C’est un excellent outil pour faire une sauvegarde du contenu de nos projets de développement.

Il est disponible pour Windows, MacOS (via Homebrew) et Linux. Il est aussi disponible sous forme de conteneurs Docker.

Github: https://github.com/gabrie30/ghorg

Homebrew: brew install ghorg

Voici un exemple d’utilisation avec GitLab.

capture d'écran de l'utilisation du logiciel ghorg avec un dépôt GitLab

Configuration de ghorg

Le logiciel se configure avec un fichier situé à cet endroit: $HOME/.config/ghorg/conf.yaml

Voici les principales variables à configurer

  • GHORG_SCM_TYPE: le type de dépôt (gitlab, github, bitbucket ou gitea)
  • GHORG_ABSOLUTE_PATH_TO_CLONE_TO: le chemin où cloner les différents dépôts
  • GHORG_CLONE_TYPE: type de compte (org, pour un groupe ou user, pour un compte personnel)
  • GHORG_SCM_BASE_URL: URL de base du dépôt (seulement le domaine avec https://)
  • GHORG_CLONE_WIKI: Mettre à true si tu utilises aussi la fonctionnalité wiki des dépôts.
  • GHORG_FETCH_ALL: Télécharger toutes les branches en mettant à true.
  • GHORG_GITHUB_TOKEN, GHORG_GITLAB_TOKEN, GHORG_GITEA_TOKEN ou GHORG_BITBUCKET_OAUTH_TOKEN: le jeton API pour accéder au dépôt

Avec GitLab, tu peux aussi préciser de garder l’arborescence des groupes et sous-groupes avec GHORG_PRESERVE_DIRECTORY_STRUCTURE à true.

Ça prend un token d’accès personnel avec la permission read_repository. Avec tout ça, tu vas avoir un fichier comme suit:

GHORG_SCM_TYPE: gitlab
GHORG_CLONE_PROTOCOL: https
GHORG_ABSOLUTE_PATH_TO_CLONE_TO: ***UN CHEMIN SUR TON ORDINATEUR ICI***
GHORG_CLONE_TYPE: org
GHORG_SCM_BASE_URL: https://git.valeria.science
GHORG_INCLUDE_SUBMODULES: false
GHORG_PRUNE: false
GHORG_PRUNE_NO_CONFIRM: false
GHORG_SKIP_ARCHIVED: true
GHORG_SKIP_FORKS: false
GHORG_BACKUP: false

Dans la section GitLab, tu ajoutes:

GHORG_GITLAB_TOKEN: ***TON TOKEN GITLAB ICI***
GHORG_PRESERVE_DIRECTORY_STRUCTURE: true
GHORG_INSECURE_GITLAB_CLIENT: false
GHORG_GITLAB_GROUP_EXCLUDE_MATCH_REGEX: false

Pour cloner tous les repos, tu utilises la commande ghorg clone avec le nom de l’organisation, par exemple jevalideca.

ghorg clone jevalideca

Tu peux ensuite te déplacer dans le projet qui se trouve dans le répertoire que tu as spécifié dans le fichier de configuration. Tu y trouveras une copie de tous les répertoires Git de ton organisation.

cd projets/ghorg/jevalideca

Tu as plusieurs gestionnaires de dépôts ?

Si tu as plusieurs gestionnaires de dépôts git différents, tu peux te créer un fichier de configuration pour chacun, puis le copier dans $HOME/.config/ghorg/conf.yaml avant de cloner.
Par exemple, j’ai un fichier pour mon instance personnelle de GitLab, situé à $HOME/.config/ghorg/conf-gitlab-jevalideca.yaml.

Pour le copier, j’utilise la commande suivante

cp $HOME/.config/ghorg/conf-gitlab-jevalideca.yaml $HOME/.config/ghorg/conf.yaml

J’utilise ensuite la commande ghorg suivante pour cloner tous les projets faisant partie du groupe partage dans le répertoire que j’ai précisé dans le fichier de configuration à la variable GHORG_ABSOLUTE_PATH_TO_CLONE_TO

ghorg clone partage

Une autre option est de tout spécifier dans l’appel de la commande au lieu d’utiliser le fichier de configuration. Tout paramètre passé directement à ghorg remplace le contenu du fichier de configuration.

Chercher dans tout ton code !

Plusieurs gestionnaires de dépôts git en ligne n’offrent pas de moteur de recherche en mode plein texte gratuitement. Seul GitHub a cette fonctionnalité pour les utilisateurs.

Comme nous avons maintenant cloné tous les dépôts de nos différents gestionnaires de dépôts, nous pouvons utiliser les outils de la ligne de commande pour nous construire un petit moteur de recherche.

Le script suivant effectue une recherche dans tous les dépôts Git clonés localement. Voici un résumé de son fonctionnement :

  1. Il parcourt tous les sous-répertoires du répertoire courant.
  2. Il désactive les messages d’avertissement.
  3. Pour chaque répertoire qui est un dépôt Git (avec une branche ‘main’), il recherche SEARCH_STRING dans les 3 derniers commits de toutes les branches.
  4. Si la recherche donne un résultat d’une longueur de plus de 40 caractères, pour tenir compte du boilerplate généré par git, il affiche le nom du dépôt, les branches contenant le commit, et le résultat de la recherche ligne par ligne.
SEARCH_STRING=""

# Parcourir tous les répertoires dans le répertoire courant
for d in $(find . -type d); do
    # Vérifier si le répertoire est un dépôt Git avec une branche principale 'main'
    if [ -f "${d}/.git/refs/heads/main" ]; then
        (
        # Changer le répertoire de travail vers le dépôt Git
        cd "${d}";
        # Désactiver l'avertissement sur les noms d'objets Git
        git config advice.objectNameWarning false;
        # Parcourir les 3 derniers commits de toutes les branches
        for branch in $(git --no-pager rev-list --branches --max-count=3); do
            # Rechercher la chaîne spécifiée dans les fichiers du commit
            a=$(git --no-pager grep --line-number --full-name -G "${SEARCH_STRING}" "${branch}")
            # Si le résultat de la recherche est suffisamment long (plus de 40 caractères)
            if [[ ${#a} -gt 40 ]]; then
                # Afficher le nom du dépôt et les branches contenant le commit
                echo "Repo: ${d} Branches: $(git branch -a --contains ${branch})\n***"
                # Afficher le résultat de la recherche
                echo $a
                # Afficher un séparateur
                echo "***\n\n"
            fi
        done;
        # Réactiver l'avertissement sur les noms d'objets Git
        git config advice.objectNameWarning true
        )
    fi
done

Conclusion

ghorg permet de faire rapidement une sauvegarde de tous les projets dans git. Je t’invite à l’essayer sans plus attendre !

Visite le site officiel avec tous les détails pour l’installation.

Aller plus loin avec git ?

Tu aimerais découvrir tout le potentiel de git pour ton entreprise, même au delà du code ? J’ai eu vent que les professionnels de la rédaction et les juristes aimaient beaucoup utiliser git pour leurs textes ! En une consultation express, je peux t’aider à démarrer avec cet outil.

Consultation Express 🧠

La consultation express, c’est une heure où je me consacre entièrement à résoudre tes problèmes informatiques avec toi.

Je peux t’aider avec des enjeux de gestion de données, de cybersécurité, de courriels et aussi orienter tes choix technologiques.