web-dev-qa-db-fra.com

Continuez à parcourir les sous-modules avec la commande "git submodule foreach" après une sortie non nulle

J'ai un projet qui contient de nombreux sous-modules. Je veux parcourir chaque sous-module avec la commande suivante:

git submodule foreach npm install

Et je veux que le script continue de boucler sur chaque sous-module même si un sous-module retourne une erreur (code retour non nul). Actuellement, un code retour différent de zéro lors de l'exécution de cette commande dans n'importe quel sous-module entraînera l'arrêt de la boucle par git sur les sous-modules restants.

Avez-vous des recommandations sur la façon d'y parvenir?

44
Casey Flynn

Faites simplement que votre commande retourne toujours un 0 code comme ceci:

git submodule foreach 'npm install || :'

Ceci est tiré du manuel: git help submodule:

   foreach
       Evaluates an arbitrary Shell command in each checked out submodule.
       The command has access to the variables $name, $path, $sha1 and
       $toplevel: $name is the name of the relevant submodule section in
       .gitmodules, $path is the name of the submodule directory relative
       to the superproject, $sha1 is the commit as recorded in the
       superproject, and $toplevel is the absolute path to the top-level
       of the superproject. Any submodules defined in the superproject but
       not checked out are ignored by this command. Unless given --quiet,
       foreach prints the name of each submodule before evaluating the
       command. If --recursive is given, submodules are traversed
       recursively (i.e. the given Shell command is evaluated in nested
       submodules as well). A non-zero return from the command in any
       submodule causes the processing to terminate. This can be
       overridden by adding || : to the end of the command.

       As an example, git submodule foreach 'echo $path `git rev-parse
       HEAD`' will show the path and currently checked out commit for each
       submodule.

La commande : de help : dans bash:

:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

réussit toujours:)

94
gniourf_gniourf

Vous pouvez voir ceci sujet .

Je n'utilise pas GIT, mais si vous pouvez localiser les fichiers .gitmodules, il peut être facile de boucler pour chaque sous-module:

<command to find all of your submodules>|while read; do
    # ... (default use $REPLY as an item)
done

Ou :

while read; do
    # ...
done <<< "$(command to find all of your submodules)"

Voir ceci rappel sur la façon de lire une sortie de commande avec une boucle dans Bash .

2
Idriss Neumann