Могу ли я сделать "глубокую копию" репозитория git с подмодулями?

Легко клонировать весь проект плюс все его подмодули:

git clone --recursive [email protected]:homer/powerplant.git

Однако, как мне создать клон, у которого все эти подмодули заменены начальниками отдельных субрепозиториев? Предпочтительно таким образом, чтобы это можно было повторить легко, как только что-то изменилось. Цель должна быть "плоской" версией только для чтения того же общего кода. Не должно быть необходимости слияния.

Если это возможно, это решит мои проблемы с Launchpad, где bzr может импортировать только репозитории без подмодулей.

Ответ 1

Если вы хотите начать с файлов подмодулей, но не как git repos, просто выполните следующие действия:

  • рекурсивно клонировать git clone --recursive [email protected]:homer/powerplant.git (безумное имя репо btw)
  • затем перерегистрируйте подмодуль с git config --remove-section submodule.name

Вы получите то, что хотите, файлы подмодулей в рабочем дереве, но подмодули не инициализируются как таковые.

Вы могли бы использовать самую новую команду git submodule deinit, но она также удаляет файлы подмодуля из рабочего дерева.

Ответ 2

Вы не можете сделать это напрямую, поскольку подмодули никогда не ссылаются на HEAD. Это функция Git, которая предотвращает нежелательное обновление в зависимостях, поэтому субмодули ссылаются суперпроектом на фиксированный SHA1, который можно изменить, совершив (в суперпроекте) новые.

Обновление подмодулей до последней редакции после клонирования является простым: запустите следующие команды в суперпроекте.

git submodule foreach git merge origin/master
git commit -am "updated all submodules to origin/master"

ИЗМЕНИТЬ

Похоже, вы хотите проверить подмодули после клона, команда

git submodule update --init --recursive