У меня есть git repo, у которого есть вложенные подмодули. В чем разница между двумя командами?
git submodule update --init --recursive
git submodule foreach --recursive git submodule update --init
У меня есть git repo, у которого есть вложенные подмодули. В чем разница между двумя командами?
git submodule update --init --recursive
git submodule foreach --recursive git submodule update --init
git submodule update --init --recursive
Команда подмодуля update
будет возвращаться в зарегистрированные подмодули, обновлять и инициализировать (если требуется) их и любые вложенные подмодули внутри.
git submodule foreach --recursive git submodule update --init
foreach
будет оценивать команду в каждом извлеченном подмодуле. Таким образом, он будет обновлять и инициализировать (если требуется) каждый подмодуль и любые вложенные подмодули внутри из-за --recursive
.
Итак, в итоге обе команды достигнут того же. Просто выполнение отличается, первая команда не будет входить в каждую директорию для выполнения команды.
По моему опыту, первый работает. Второй ничего не делает.
Чтобы проект, подобный eclipse.platform.releng.aggregator, мог инициализировать подмодули, чтобы вы могли строить, вам необходимо клонировать все дочерние репозитории:
git submodule update --init --recursive
Существуют различия!
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" будет пустым, поэтому "твоя команда" вообще не состоится.