Подтвердить что ты не робот

Как мне получить git clone --recursive` для воссоздания пультов и ветвей субмодулей?

У меня есть проект с несколькими подмодулями. Многие из них клонированы из вилки GitHub, к которой я добавил ветку для моих пользовательских модов. Типичная настройка выглядит следующим образом:

В локальной папке: MyProject1/Frameworks/SomeAmazingRepo/

$ git branch -vva
*my-fork                       123456 [my-fork/my-fork] Latest commit msg from fork
master                         abcdef [origin/master] Latest commit msg from original repo
remotes/my-fork/my-fork        123456 [my-fork/my-fork] Latest commit msg from fork
remotes/my-fork/master         abcdef [origin/master] Latest commit msg from original repo
remotes/origin/HEAD            -> origin/master
remotes/origin/master          abcdef [origin/master] Latest commit msg from original repo

$ git remote -v
my-fork                        [email protected]:MyUser/SomeAmazingRepo.git (fetch)
my-fork                        [email protected]:MyUser/SomeAmazingRepo.git (push)
origin                         git://github.com/OriginalOwner/SomeAmazingRepo.git (fetch)
origin                         git://github.com/OriginalOwner/SomeAmazingRepo.git (push)

I git clone --recursive мой проект, чтобы начать новый проект выделения, и когда он начинает рекурсивно, он выплевывает ошибку, заявляя, что не может найти сохраненные коммиты для этих репозиториев. При проверке кажется, что пульты не были добавлены, и ветка оставлена ​​(пуста) в мастер...

В локальной папке: MyProject2/Frameworks/SomeAmazingRepo/

$ git branch -vva
*master                        abcdef [origin/master] Latest commit msg from original repo
remotes/origin/HEAD            -> origin/master
remotes/origin/master          abcdef [origin/master] Latest commit msg from original repo

$ git remote -v
origin                         git://github.com/OriginalOwner/SomeAmazingRepo.git (fetch)
origin                         git://github.com/OriginalOwner/SomeAmazingRepo.git (push)

Единственное средство - пойти и добавить пульты вручную во все репозитории (очень утомительно).

Существует аналогичная проблема в тех случаях, когда есть две ветки отслеживания, как указано выше, но только один удаленный (origin = > my github fork). В этом случае он обнаруживает фиксацию и проверяет ее, но не воссоздает ветвь отслеживания, оставляя "обвисшую" фиксацию... очень страшно, поскольку она не предупреждает вас!

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

4b9b3361

Ответ 1

git clone --recursive эквивалентен git submodule update --init --recursive.

А обновление подмодуля git будет только извлекать записанный SHA1 (записанный в родительском репо):

Обновите зарегистрированные подмодули, то есть клонируйте отсутствующие подмодули и извлеките фиксацию, указанную в индексе репозитория.
Это приведет к отсоединению подмодулей HEAD.

2012: То есть, поиск активной ветки в подмодуле не является нормой.
git submodule foreach 'git checkout master' может по крайней мере установить основную ветвь (если вы уверены, что все записанные SHA1 должны были быть частью 'основной' ветки для каждого подмодуля.


2013-2014: вы можете настроить файл .gitmodules, чтобы указать ветку для извлечения в вашем подмодуле.
Смотрите " Как мне обновить мои подмодули git из определенных веток? "

cd /path/to/your/parent/repo
git config -f .gitmodules submodule.<path>.branch <branch>

Любой пульт, который вы добавляете локально в подмодуль, например my-fork, вообще не записывается в родительский репозиторий.
Поэтому, когда вы снова клонируете этот родительский репозиторий, он инициализирует и обновит подмодули, как записано в файле .gitmodules (вы можете изменить этот адрес, но только один связан с каждым подмодулем).
Если у вас есть другой удаленный адрес для привязки к каждому подмодулю, вам нужен скрипт для автоматизации процесса.

Как объясняется в " Истинной природе подмодуля ", подмодуль в первую очередь предназначен для записи/доступа к фиксированной точке в истории.
Вы можете разрабатывать непосредственно в подмодуле, но вам нужно пойти туда и сделать правильную ветвь и/или добавить нужные пульты.

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

Каждый раз, когда вы делаете коммит в подмодуле, вам необходимо:

  • перенесите его на связанный пульт (т.е. тот, который записан в .gitmodules родительского репо)
  • вернитесь в родительский репо и зафиксируйте указанного родителя.

Но:

Если вы нажали на " my-fork ", в то время как соответствующее удаленное репо этого подмодуля не было " my-fork "... тогда следующий клон не сможет извлечь эту подмодульную фиксацию.


Обновление Август 2014 (Git 2.1)

Смотрите коммит 9393ae7 Мэтью Чена (charlesmchen):

подмодуль: документ " sync --recursive "

Команда " git submodule sync " поддерживает флаг --recursive, но в документации это не упоминается.
Этот флаг полезен, например, когда пульт ДУ изменяется в подмодуле подмодуля.


Обновление Git 2.23 (3 квартал 2019)

Вы также можете рассмотреть git clone --recurse-submodule --remote-submodules: он будет клонировать с подмодулями, уже извлеченными в их ветки отслеживания, вместо родительского репозитория gitlink SHA1.