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