J'ai un référentiel Git qui contient d'autres référentiels Git. Existe-t-il des commandes qui poussent et/ou tirent de manière récursive non seulement pour le méta-référentiel mais également pour les sous-référentiels?
si vous parlez de sous-modules, voir la réponse de cupcakes.
si vous parlez d'une hiérarchie de dossiers contenant des dépôts git, vous pouvez récupérer clustergit
, un outil que j'ai programmé: https://github.com/mnagel/clustergit
Je me trouve dans la même situation chaque fois que je veux mettre à jour mes référentiels llvm/clang et avec un peu d'aide bash, je peux 'tirer chacun' comme ça:
$> for dir in $(find . -name ".git"); do cd ${dir%/*}; git pull ; cd -; done
Cela "git tirera" tous les dépôts git trouvés dans votre répertoire actuel, et ne fonctionnera probablement pas s’il s’agit de dépôts nus.
Pas tout à fait git pull
, mais proche:
git fetch --recurse-submodules
De les documents Git :
--recurse-submodules[=yes|on-demand|no]
Cette option détermine également si et dans quelles conditions les nouveaux commits des sous-modules remplis doivent être récupérés. Il peut être utilisé comme une option booléenne pour désactiver complètement la récursion lorsqu'il est défini sur Non ou pour effectuer une récidive inconditionnelle dans tous les sous-modules remplis lorsqu'il est défini sur Oui, valeur par défaut lorsque cette option est utilisée sans aucune valeur. Utilisez à la demande pour ré-initier uniquement dans un sous-module rempli lorsque le superprojet récupère un commit qui met à jour la référence du sous-module à un commit qui ne figure pas déjà dans le clone de sous-module local.
Je viens d'écrire un script à exécuter de manière récursive sur plusieurs référentiels git. Vous pouvez le récupérer d'ici:
https://github.com/DariuszOstolski/rgit
L'idée est exactement la même que dans clustergit mais la mise en œuvre diffère.
J'avais besoin de cela il y a quelque temps et j'ai mis un cli à disposition via NPM. https://github.com/kenglxn/gitr/blob/master/README.md
Il suffit de faire "npm install -g gitr" et vous pouvez ensuite exécuter n'importe quelle commande git de manière récursive en utilisant gitr.