2016-10-12 3 views
5

У меня есть супер репо и несколько подмодулей в этом репо:Преобразовать мерзавец репо в субмодуля и переместить .git директорию superepo

MY_SUPER_REPO

  • my_sub_1
  • my_sub_2

Теперь я создаю новый каталог, который позже станет подмодулем:

  • my_dir_3

Когда я готов для того, чтобы стать суб репо я:

git init 
git remote add origin URL 

Я затем перейти на супер репо и

git submodule add URL 

Сейчас. gitmodules соответственно обновлены, но каталог .git остается в my_dir_3, и крючки, похоже, берутся здесь, когда я работаю в этом модуле, а не из каталога супер repo .git/modules/xyz. Я запускаю сценарий для копирования крючков в .git/modules/xyz в моем супер-репо, но так как локальная папка .git существует в добавленном модуле, крючки в супер-репо не используются.

Есть ли какая-нибудь «волшебная» команда, чтобы исправить это или мне нужно скопировать .git вручную?

+0

Какую версию Git вы используете? (просто чтобы проверить, если это ошибка, которая могла быть исправлена ​​позже) – VonC

+0

Я не думаю, что это версия. Может быть, так оно и будет реализовано. Я использую один из последних выпусков: 2.10.1. – Henrik

ответ

3

Вы можете немного изменить процесс и:

  • после того как вы добавили удаленный URL (git remote add origin URL), вы бы первый толчок, что новый репозиторий для его удаленного адресата
  • затем удалить папку
  • наконец, вы добавить свой подмодуль обычным способом (git submodule add URL)

Таким образом, вы уверены подмодуль правильно инициализирован, а его .git находится в нужном месте.

0

Я ответил на основании того, что я понял из вашего вопроса, комментарий, если есть что-то, что вам нужно.

Предположим, вы создаете новый каталог, который позже станет подмодулем. Если вы не хотите отслеживать изменения в этом каталоге, добавьте это в .gitignore из вас super_repo. Теперь, допустим, вы решили сделать его дополнительным модулем, сделайте это от вас super_repo.

1) Удалить каталог из.gitignore

2) Инициализировать ваш my_dir_3

мерзавец INIT

3) Добавить подмодуль в свой супер репо

мерзавец подмодуль добавить MODULE_NAME

Ваш субмодуль добавляется в супер-репо. Вещи, которые вы должны знать, чтобы работать с подмодулями (по крайней мере, в вашем случае):

1) Ваш super_repo также должен быть git repo.

2) Подмодули обрабатываются как разные объекты в git, то есть изменения от модуля не отразятся в другом. Например, фиксация в my_sub_1 не будет отображаться в my_sub_2.

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

4) «git status» после добавления субмодуля должен показать вам .gitmodules, вы заметите все подмодули внутри .gitmodules.

5) Вот интересная часть о подмодуле git, Допустим, вы внесли некоторые изменения в my_sub_3, Git видит его как подмодуль и не отслеживает его содержимое, когда вы не находитесь в этом каталоге.

Так что если вы находитесь вне каталога, изменения не будут отслеживаться. Если вы фиксируете на этом этапе, это будет рассматриваться как часть super_repo а не my_sub_3

Наконец,

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

Вы можете добавить пульт дистанционного управления для другого проекта и использовать subtree merge strategy, вместо того, чтобы обрабатывать другой проект как подмодуль