Как "git clone", включая подмодули? - PullRequest
1760 голосов
/ 26 сентября 2010

Я пытаюсь поместить подмодуль в репо.Проблема в том, что когда я клонирую родительский репозиторий, папка субмодуля полностью пуста.

Есть ли способ сделать так, чтобы git clone parent_repo фактически помещал данные в папку субмодуля?Например, http://github.com/cwolves/sequelize/tree/master/lib/, nodejs-mysql-native указывает на внешний подмодуль git, но когда я извлекаю проект sequelize, эта папка пуста.

Ответы [ 13 ]

2724 голосов
/ 14 декабря 2010

С версией 2.13 Git и выше, --recurse-submodules может использоваться вместо --recursive:

git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar

Примечание редактора: -j8 - это дополнительная оптимизация производительности, которая стала доступна в версии 2.8 и позволяет одновременно получать до 8 субмодулей одновременно - см. man git-clone.

С версией 1.9 Git до версии 2.12 (флаг -j доступен только в версии 2.8 +):

git clone --recursive -j8 git://github.com/foo/bar.git
cd bar

С версией Git 1.6.5 и выше вы можете использовать:

git clone --recursive git://github.com/foo/bar.git
cd bar

Для уже клонированных репозиториев или более старых версий Git используйте:

git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive
432 голосов
/ 26 сентября 2010

Перед заполнением подмодуля нужно сделать две вещи:

git submodule init 
git submodule update
167 голосов
/ 26 сентября 2010

Оригинальный ответ 2010

Как отмечает joschi в комментариях, git submodule теперь поддерживает параметр --recursive (Git1.6.5 и более).

Если указано --recursive, эта команда вернется в зарегистрированные подмодули и обновит все вложенные подмодули внутри.

См. Рекурсивная работа с подмодулями git для части init.
Подробнее см. git submodule .

В git версии 1.6.5 и выше вы можете сделать это автоматически, клонировав супер-проект с опцией –-recursive:

git clone --recursive git://github.com/mysociety/whatdotheyknow.git

Обновление 2016, с git 2.8: см. « Как ускорить / распараллелить загрузку подмодулей git с помощью git clone --recursive? »

Вы можете инициировать выборку субмодуля параллельно, используя несколько потоков.
Для примеров:

git fetch --recurse-submodules -j2

Еще лучше, с Git 2.23 (Q3 2019), вы можете клонировать и извлечь субмодуль в их ветку трекинга одной командой!

См. коммит 4c69101 (19 мая 2019 г.) Бен Ависон (``) .
(Объединено с Junio ​​C Hamano - gitster - в коммит 9476094 , 17 июня 2019 г.)

clone: добавить --remote-submodules флаг

При использовании git clone --recurse-submodules ранее не было никакого способа передайте --remote switch неявной команде git submodule update для любой случай использования, когда вы хотите, чтобы субмодули были проверены на их ветвь удаленного слежения, а не SHA-1, записанная в суперпроекте.

Этот патч исправляет эту ситуацию.
На самом деле он также передает --no-fetch в git submodule update на том основании, что субмодуль только что был клонирован, поэтому выборка с пульта снова лишь замедляет процесс.

Это значит:

--[no-]remote-submodules:

Все подмодули, которые клонируются, будут использовать состояние ветви удаленного отслеживания подмодуля для обновления подмодуля, а не записанного SHA-1 суперпроекта. Эквивалент прохождения от --remote до git submodule update.

56 голосов
/ 16 октября 2017

Вы можете использовать эту команду для клонирования вашего репо со всеми подмодулями:

git clone --recursive YOUR-GIT-REPO-URL

Или, если вы уже клонировали проект, вы можете использовать:

git submodule init
git submodule update
30 голосов
/ 08 марта 2012

Если ваш подмодуль был добавлен в ветку, обязательно включите его в команду клонирования ...

git clone -b <branch_name> --recursive <remote> <directory>
27 голосов
/ 16 января 2013

Попробуйте это:

git clone --recurse-submodules

Он автоматически извлекает данные субмодуля, если вы уже добавили субмодули в родительский проект.

21 голосов
/ 16 января 2019

Я думаю, вы можете сделать 3 шага:

git clone
git submodule init
git submodule update
19 голосов
/ 16 февраля 2013

поздний ответ

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR

Поскольку я провел целый час, возясь с другом: даже если у вас есть права администратора на BitBucket, всегда клонируйте ОРИГИНАЛЬНЫЙ репозиторий и используйтепароль того, кто владеет репо.Раздражает, когда узнаешь, что ты наткнулся на этот минетрап: P

17 голосов
/ 05 февраля 2018

Попробуйте включить подмодули в репозиторий git.

git clone -b <branch_name> --recursive <remote> <directory>

или

git clone --recurse-submodules
14 голосов
/ 17 января 2019

Вы можете использовать флаг --recursive при клонировании репозитория. Этот параметр заставляет git клонировать все определенные подмодули в хранилище.

git clone --recursive git@repo.org:your_repo.git

После клонирования иногда могут изменяться ветви подмодулей, поэтому выполните следующую команду:

git submodule foreach "git checkout master"
...