Marthym bio photo

Marthym

Frédéric, un Nième développeur qui partage ses aventures ...

Pour tous ceux qui travaillent avec plusieurs dépôts git, voire une multitude, il est parfois très fastidieux de les tenir à jour. Le plus simple est la boucle bash qui fait tous les updates à la suite :

find . -type d -depth 1 -exec git --git-dir={}/.git --work-tree=$PWD/{} pull origin master \;

C’est déjà bien pratique mais ce n’est pas très clair. C’est très verbeux, on distingue mal les problèmes des mises à jour. Il faut retrouver les dépôts non mis à jour à cause de fichiers en cours de modification ou à cause d’autres problèmes … Bref ce n’est pas la solution ultime.

Une recherche sur internet nous propose des quantités des solutions mais rien de simple, clair, facile à mettre en place. Voici donc un script qui fait un pull de tous les dépôts git présent dans le répertoire home de l’utilisateur courant.

Ce script donne en sortie une ligne pour chaque dépôt trouvé. Sur chaque ligne on aura l’url du dépôt, la branche courrante et le résultat du pull :

  • UP TO DATE: pour les dépôts déjà à jour
  • UPDATED: pour les dépôts mis à jour
  • DIRTY: pour les dépôts nécessitant un commit
  • ERROR: pour les dépôts en error. Dans ce cas, l’erreur est affiché en suivant.

A la fin de la procédure un récapitulatif des dépôts en erreur est affiché.

Voilà, j’espère que ça servira à d’autres, je suis ouvert à toutes amélioration.

EDIT 2016-03-21: Mise à jour du script
Limitation du nombre de thread via xargs. Sous les versions récentes de docker le nombre de process fils est limité et le script générait des erreurs de fork. En limitant le nombre de thread à 5 on évite ce problème sans que la durée totale de la mise à jour n’en soit trop impactée.

find -L ~ -maxdepth 5 -path "*.git" -not -path "*zprezto*" -type d 2> /dev/null | \
  xargs --max-proc=$MAX_PROC -n 1 -I {} bash -c "update_git_repo {}"

De plus le wait n’est plus nécessiare, c’est xargs qui s’en occupe. Par contre il est nécessaire d’exporter toutes les variables et les fonctions.

EDIT 2016-03-17: Mise à jour du script
Amélioration du threading :

  • La fonction de log est synchrone pour éviter que plusieurs résultats s’affiche sur la même ligne.
  • L’affichage des erreurs est amélioré.
  • La synthèse des erreurs en fin de script marche à nouveau.
  • Utilisation de wait à la place de la boucle pour attendre les fils.

EDIT 2015-12-11: Mise à jour du script
Le scrip est modifié pour être multi-thread, c’est beaucoup plus rapide sur un grande quantité de repos.