Git subodule foreach - надежный способ рекурсивно зафиксировать дочерний модуль?

Есть ли надежный способ сделать рекурсивную команду глубины git submodule foreach? Я использую команду foreach --recursive, которая выполняет задание, за исключением того, что она имеет ширину. Это проблема, потому что, если у меня есть следующая структура:

    • В
  • С

И я совершил во всех трех случаях, a foreach --recursive add -A && git commit ... ударит по A, B, C, что является проблематичным, если я хочу, чтобы супермодуль фиксировал фиксации B в это время.

Я нашел эту дискуссию с 2008 года, но не похоже, что какая-либо из предложенных функций находится в текущей версии Git, которая у меня есть (1.7. 9.5).

Я написал небольшую функцию bash для этого (извините сокращение имен):

function git-sfed() { git submodule foreach "git submodule foreach '$*' && $*"; }

И тестирование его следующей командой fanciful работает:

git-sfed 'python -c "import sys; print sys.argv" $path'

Эта команда кажется надежной или существуют другие распространенные существующие методы?

Ответ 1

Вы можете попробовать это

git submodule  foreach --recursive  |  tail  -r | sed 's/Entering//' | xargs -I% cd % ; git add -A \& git commit

Этот список (рекурсивно) содержит все подмодули, затем переверните список, tail -r, чтобы получить каталоги в том порядке, в котором вы хотите (сначала ребенок), введите каталог и сделайте все, что захотите.

Ответ 2

Я не нашел другого способа, кроме вашей функции, выполнить команду foreach глубины.

Тест будет состоять в том, чтобы проверить, достигает ли он рекурсивности на глубине более одного.

A
  B
    D
  C

У меня были проблемы с вашей и моей командой, когда я пытался заключить в одинарные кавычки (вроде отстой, не имея возможности написать их) - переход с нескольких уровней команд bash немного сбивает с толку.

Это (проблема с кавычками) должно быть упрощено в Git 1.9/2.0 (1-й квартал 2014 года) с commit 1c4fb13 от Андерса Касерога (andersk):

"eval "[email protected]"" создает дополнительный слой интерпретации оболочки, который, вероятно, не ожидается пользователем, который передает несколько аргументов в подмодуль git foreach:

 $ git grep "'"
 [searches for single quotes]
 $ git submodule foreach git grep "'"
 Entering '[submodule]'
 /usr/lib/git-core/git-submodule: 1: eval: Syntax error: Unterminated quoted string
 Stopping at '[submodule]'; script returned non-zero status.

Чтобы это исправить, если пользователь передает более одного аргумента, выполните "[email protected]" напрямую, вместо того, чтобы передавать его в eval.

Examples:

  • Обычно при добавлении дополнительного уровня цитирования передается один аргумент, представляющий всю команду для передачи в оболочку.
    Это не меняет этого.
  • Можно представить, что кто-то вводит ненадежные данные в качестве аргумента:
    git submodule foreach git grep "$variable"

В настоящее время это приводит к неочевидной уязвимости внедрения кода.
Непосредственное выполнение команды, названной аргументами, как в этом патче, исправляет ее.


После Git 2.21 (Q2 2017) у вас есть git grep -e "bar" --recurse-submodules