'git обновление подмодуля --init --recursive' VS 'git subsodule foreach --recursive git обновление подмодуля --init'
У меня есть git repo, у которого есть вложенные подмодули. В чем разница между двумя командами?
git submodule update --init --recursive
git submodule foreach --recursive git submodule update --init
Ответы
Ответ 1
git submodule update --init --recursive
Команда подмодуля update
будет возвращаться в зарегистрированные подмодули, обновлять и инициализировать (если требуется) их и любые вложенные подмодули внутри.
git submodule foreach --recursive git submodule update --init
foreach
будет оценивать команду в каждом извлеченном подмодуле. Таким образом, он будет обновлять и инициализировать (если требуется) каждый подмодуль и любые вложенные подмодули внутри из-за --recursive
.
Итак, в итоге обе команды достигнут того же.
Просто выполнение отличается, первая команда не будет входить в каждую директорию для выполнения команды.
Ответ 2
По моему опыту, первый работает. Второй ничего не делает.
Чтобы проект, подобный eclipse.platform.releng.aggregator, мог инициализировать подмодули, чтобы вы могли строить, вам необходимо клонировать все дочерние репозитории:
git submodule update --init --recursive
Ответ 3
Существуют различия!
git submodule update --init --recursive
зарегистрирует прямые зависимые подмодули и клонирует их, затем перейдет на следующую глубину, зарегистрирует подмодули и рекурсивно клонирует их. Наконец, все прямо или косвенно зависимые подмодули будут зарегистрированы и клонированы с удаленного компьютера.
Если существует циклическая зависимость, эта команда никогда не прекратит работу.
git submodule foreach --recursive git submodule update --init
Эта команда следует шаблону:
git submodule foreach --recursive "your command"
что означает, что сначала "git submodule foreach --recursive" сгенерирует набор подмодулей, затем в каждом подмодуле ваша команда будет выполнена. Однако для начального проекта без выполнения "git submodule init", а затем "git submodule update", "git submodule foreach --recursive" будет пустым, поэтому
"твоя команда" вообще не состоится.