Продолжить цикл над субмодулями с помощью команды git subodule foreach "после ненулевого выхода

У меня есть проект, содержащий много подмодулей. Я хочу перебрать каждый подмодуль с помощью следующей команды:

git submodule foreach npm install

И я хочу, чтобы script продолжал цикл по каждому подмодулю, даже если один подмодуль возвращает ошибку (ненулевой код возврата). В настоящее время ненулевой код возврата от запуска этой команды в любом подмодуле приведет к тому, что git прекратит цикл по оставшимся подмодулям.

Любые рекомендации о том, как это сделать?

Ответ 1

Просто сделайте, чтобы ваша команда всегда возвращала код 0 следующим образом:

git submodule foreach 'npm install || :'

Это взято из руководства: 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.

Команда : из help : в bash:

:: :
    Null command.

    No effect; the command does nothing.

    Exit Status:
    Always succeeds.

Всегда удается :)

Ответ 2

Вы можете увидеть эту тему .

Я не использую GIT, но если вы можете найти файлы .gitmodules, может быть легко петля для каждого подмодуля:

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

Или:

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

Смотрите это напоминание о том, как читать вывод команды с циклом в Bash.