Как "совершить" изменения в подмодуле git?

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

Есть ли какой-то простой способ совершить/подтолкнуть изменения подмодуля обратно в репозиторий вверх по течению? И какой рекомендуемый метод в git для одновременной разработки на отдельных (но связанных) репозиториях таким образом?

Ответ 1

Подмодуль - это собственный репо/рабочая область с собственным каталогом .git.

Итак, сначала commit/push вашего подмодуля:

$ cd path/to/submodule
$ git add <stuff>
$ git commit -m "comment"
$ git push

Затем обновите ваш основной проект, чтобы отслеживать обновленную версию субмодуля:

$ cd /main/project
$ git add path/to/submodule
$ git commit -m "updated my submodule"
$ git push

Ответ 2

Обратите внимание, что если вы зафиксировали кучу изменений в различных подмодулях, вы можете (или скоро сможете) выдвинуть все за один раз (т.е. Один толчок из родительского репо) с помощью:

git push --recurse-submodules=on-demand

git1.7.11 ([ANNOUNCE] Git 1.7.11.rc1) упоминает:

" git push --recurse-submodules " научился по выбору изучать истории подмодулей, связанных с суперпроектом, и выталкивать их.

Вероятно, сделано после этого патча и --on-demand:

--recurse-submodules=<check|on-demand|no>::

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

  • Если используется check, будет проверено, что все коммиты подмодулей, которые были изменены в ревизиях, которые должны быть переданы, доступны на удаленном компьютере.
    В противном случае нажатие будет прервано и завершится с ненулевым статусом.
  • Если используется on-demand, все субмодули, которые изменились в ревизиях, которые должны быть переданы, будут переданы.
    Если по требованию не удалось выдвинуть все необходимые изменения, он также будет прерван и завершится с ненулевым статусом.

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

Ответ 3

$ git submodule status --recursive

Является также спасателем жизни в этой ситуации. Вы можете использовать его и gitk --all, чтобы отслеживать свой sha1 и проверять, что ваши подмодули указывают на то, что вы думаете.

Ответ 4

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

Ответ 5

Прежде чем вы сможете совершать и нажимать, вам нужно создать дерево репозитория для подмодуля. Я использую черепаху и делаю следующие вещи:

Сначала проверьте, существуют ли .git файл (а не каталог)

  • если есть такой файл, он содержит путь к супермодулю git directory
  • удалить этот файл
  • do git init
  • do git добавить удаленный путь, который используется для подмодуля
  • следуйте инструкциям ниже

Если был .git файл, там был угрюмый каталог .git, который отслеживает локальное дерево. Вам все еще нужна ветка (вы можете ее создать) или переключиться на мастер (что иногда не работает). Лучше всего сделать  - git fetch  - git тянуть. Не опускайте выборку.

Теперь ваши фиксации и выходы будут синхронизированы с вашим начальным/основным