Git: как подставить подмодуль в удаленный репозиторий?

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

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

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

Что я могу сделать?

Ответ 1

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

Вам нужно в какой-то момент инициализировать подмодули на вашем сервере. Похоже, что у вас есть настройка с деревом вашей работы отдельно от вашего репо, так что, как и с этим git checkout -f, вам нужно будет разместить это: GIT_WORK_TREE=/path/to/whatever git submodule update --init. Впоследствии, когда ваш крючок запускает git checkout -f после нажатия, ему также потребуется запустить git submodule update (снова с соответствующим деревом работы).

Но это сложнее, чем это. Вы не указали какую-либо информацию о том, откуда пришли ваши подмодули, но подмодуль знает о его происхождении, как и ваш репозиторий. Когда вы инициализируете один, он пытается клонировать из этого источника, и для его обновления часто требуется выборка из этого источника. Если, как я подозреваю, источник для сторонних библиотек - это нечто общедоступное, к которому у вас нет push-доступа, вам придется настроить свои собственные центральные хранилища для подмодулей. Когда вы совершаете фиксацию в одном из подмодулей, вы нажимаете на свое центральное репо, а затем нажимаете родительский проект, чтобы при попытке обновить подмодули в другом месте он мог их получить.

Итак, чтобы повторить, рабочий процесс выглядит примерно так:

  • фиксация в стороннем субмодуле (или его автономном клоне)
  • перетащите стороннюю библиотеку в центральный репозиторий
  • добавить подмодуль в родительском репо (сообщить ему о новом коммите) и зафиксировать
  • передать родительский проект в центральное репо
  • родительский центральный репо-крюк проверяет ваш сервер и обновляет подмодуль там

Ответ 2

Как отметил Джероми, вашему подмодулю нужен "remote", чтобы его можно было нажать.

Я думаю, что вам не хватает шага, поэтому

submodule-dir/$ git remote add origin <where to push submodule>

Ниже приведен простой пример: Git: нажатие нового подмодуля

Ответ 3

Субмодуль на самом деле является отдельным репо, которое переносится на другой пульт. Таким образом, в основном, когда вы что-то меняете в своем подмодуле, вам нужно быть в рабочем пространстве подмодуля, чтобы нажать на него. Более того, после того, как вы подтолкнули ваш подмодуль, вам также нужно нажать основной проект.

Вот некоторые примеры

Ответ 4

У меня была аналогичная проблема: клон репо на ПК (A) с удаленным внешним сайтом, и я хотел иметь клон моего локального репо на другом ПК (B) в той же сети, где мог нажимайте мои изменения на (через ssh) и делайте некоторые тесты (некоторые из моих тестов на регрессию занимают очень много времени), так что я мог бы продолжать работать над (A) на другой ветке, если это необходимо. Репо в (А) имеет подмодуль.

В (B) я создал голый репо:

mkdir /path/to/bare_git && cd /path/to/bare_git
git --bare init

и добавил его как новый пульт в моем локальном репо в (A):

git add remote name_of_B_repo ssh://[email protected]/path/to/bare_git/

и нажал локальное репо в (A) (возможно, с изменениями, которые еще не были опубликованы) для моего ssh-репо:

git push name_of_B_repo branch_to_push

После этого я клонирую свое голое репо изнутри (B):

mkdir /path/to/B_clone && cd /path/to/B_clone
git clone /path/to/bare_git
git submodule update --remote

и я мог видеть, что мой подмодуль не был включен.

Решение 1. Если вам неинтересно тестировать/изменять содержимое вашего подмодуля, но вам нужно его выполнить ваши тесты, вы можете включить ссылку на внешний сайт прямо в .git/config (B), как:

[submodule]
        url = http://submodule_external_website_url

то просто обновите свой подмодуль:

git submodule update --remote

Решение 2. Если вы заинтересованы в изменении содержимого подмодуля в (A) и отправте его на (B), сначала вам нужно добавить репозиторий ssh ​​в (B) к вашему локальный (A) субмодульный репо как новый пульт:

cd /path/to/submodule
git add remote name_of_B_repo ssh://[email protected]/path/to/bare_git/

нажмите на свои изменения:

cd /path/to/main_A_local_repo
git submodule foreach git push name_of_B_repo branch_to_push

добавьте локальный путь подмодуля в файл .git/config клон-репо в (B) как:

[submodule]
        url = /path/to/bare_git

и обновите модули следующим образом:

git submodule update --remote