Git: как отправить субмодуль в удаленный репозиторий? - PullRequest
15 голосов
/ 04 декабря 2011

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 04 декабря 2011

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

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

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

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

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

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

Полагаю, шаг, который вы пропустили, поэтому

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

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

3 голосов
/ 04 декабря 2011

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

Вот несколько примеров

1 голос
/ 03 марта 2017

У меня была похожая проблема: клон репо на ПК (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://user@host/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 of (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://user@host/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 fИло клона репо в (B) как:

[submodule]
        url = /path/to/bare_git

и обновите свои модули как раньше:

git submodule update --remote
...