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

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

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

Однако как мне создать клон, в котором все эти подмодули будут заменены на ГОЛОВКИ отдельных репозиториев? Желательно таким образом, чтобы это можно было легко повторить, как только что-то изменится. Целевой объект должен быть доступной только для чтения «плоской» версией того же общего кода. Нет необходимости в слиянии.

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


person Anne van Rossum    schedule 21.10.2013    source источник
comment
возможный дубликат Необходимо обрабатывать подмодули git в git-archive   -  person CharlesB    schedule 22.10.2013
comment
Я не интересуюсь архивированием. Мне просто нужна глубокая копия репозитория git, в котором структура подмодуля удалена и заменена соответствующим кодом. Мне скорее нужен git flatten, если бы он существовал.   -  person Anne van Rossum    schedule 20.11.2013
comment
Да, лучше использовать git clone --recursive и checkout master для всех подмодулей в одной строке?   -  person CharlesB    schedule 20.11.2013
comment
Нет, это тоже что-то другое. Структура подмодуля не исчезнет, ​​потому что вы оформляете заказ, а bzr все равно не поймет ее. Мне действительно нужна плоская копия, а не просто обычный клон.   -  person Anne van Rossum    schedule 20.11.2013


Ответы (2)


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

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

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

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

person CharlesB    schedule 20.11.2013
comment
Я должен проверить, принимает ли это Launchpad, но я думаю, что это действительно так, как я себе это представлял! - person Anne van Rossum; 20.11.2013
comment
Сообщается ли где-нибудь о проблеме с подмодулями Launchpad и git? - person CharlesB; 20.11.2013

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

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

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

РЕДАКТИРОВАТЬ

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

git submodule update --init --recursive
person CharlesB    schedule 21.10.2013
comment
Спасибо, но проблема не в том, что я не знаю, как обновить репозиторий с помощью подмодулей. Мне нужна копия того репозитория, в котором подмодули были заменены своим кодом. В противном случае bzr не сможет его импортировать. - person Anne van Rossum; 21.10.2013
comment
Понятно, см. Этот вопрос: Как мне использовать git clone --recursive и checkout master для всех подмодулей в одной строке? (I включил в мой правильный ответ, не все верны) - person CharlesB; 21.10.2013
comment
Да, это другой вопрос. Я думаю, что единственное решение в моем случае, когда я не хочу иметь никаких подмодулей в целевом репозитории, - это полностью обойти git (и потерять историю): rsync -avzul source-repos/ --exclude=.gitmodules --exclude=.git dest-repos/. Теперь в финальном репозитории у меня больше нет подмодулей. Сравните github.com/dobots/aim с github.com/dobots/aim-bzr. - person Anne van Rossum; 21.10.2013
comment
В ПОРЯДКЕ; Значит, вам нужен дамп репозитория без репозитория .git, включая подмодули, верно? - person CharlesB; 21.10.2013
comment
Хорошая находка. Действительно, этого может быть достаточно для рекурсивного запуска git-archive. Однако в этом случае я предпочитаю запускать rsync сам (как указано выше), поэтому я точно знаю, что произойдет. Это однострочный вариант, так что проблем не возникает. Я просто подумал, что, возможно, я пропустил git вариант. - person Anne van Rossum; 22.10.2013
comment
Конечно, здесь справится rsync. Не уверен в преимуществах такого сценария, но должны быть вещи, о которых он более осведомлен. - person CharlesB; 22.10.2013