Перенос субмодулей Git в отдельное рабочее дерево - PullRequest
0 голосов
/ 08 ноября 2011

На нашем промежуточном сервере у нас есть пустое хранилище, которое отправляется на. У него есть ловушка post-receive, которая затем выполняет все наши действия по развертыванию, которые извлекаются в отдельное рабочее дерево (в котором нет папки git).

Итак, установка такова:

голое репо на

/var/www/apps/e_learning_staging/elearning_resource.git

рабочее дерево на

/var/www/apps/e_learning_staging/www

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

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

[core]
  repositoryformatversion = 0 
  filemode = true
  bare = true
  logallrefupdates=true
  worktree = /var/www/apps/e_learning_staging/www
  gitdir = /var/www/apps/e_learning_staging/elearning_resource.git
  [submodule "public/assets/players/virgin_lesson_viewer"]
    url = user@another.server.com:/home/charangadh/source_code/git/virgin_lesson_viewer.git
  [submodule "public/assets/players/virgin_lesson_viewer_staging"]
    url = user@another.server.com:/home/charangadh/source_code/git/virgin_lesson_viewer_staging.git
  [submodule "public/assets/dvd_files/Virgin_lesson_viewer"]
    url = user@another.server.com:/home/charangadh/source_code/git/virgin_lesson_viewer.git
  [submodule "public/assets/dvd_files/Virgin_lesson_viewer_staging"]
    url = user@another.server.com:/home/charangadh/source_code/git/virgin_lesson_viewer_staging.git

Если бы папка git находилась внутри рабочего дерева, это было бы достаточно просто - я бы просто сделал

git submodule add user@another.server.com:/home/charangadh/source_code/git/virgin_lesson_viewer.git public/assets/dvd_files/Virgin_lesson_viewer

для каждого из подмодулей, затем выполните «git submodule update», чтобы обновить их. Но я не могу понять, как это сделать из отдельной папки git. Кто-нибудь может привести меня в порядок?

1 Ответ

0 голосов
/ 20 ноября 2011

Если я хорошо понимаю вашу проблему, вы в основном хотите сделать git submodule update в каталоге развертывания, но не можете, потому что это не настоящий рабочий каталог.

Моим решением было быреализовать пользовательскую git submodule update -подобную команду:

  1. Определить, на какую версию подмодуля ссылается супермодуль
  2. Извлечь эту версию в целевой каталог.Вы можете сделать это так же, как и при проверке супермодуля.

Допустим, у вас есть следующие настройки на вашем сервере:

  • Голые репозитории хранятся в /opt/repos/supermodule.gitи /opt/repos/submodule.git
  • Когда вы нажимаете супермодуль, вы хотите оформить супермодуль в /var/www/supermodule, а субмодуль в /var/www/supermodule/assets/submodule

. Вы должны сделать следующее вхук после получения /opt/repos/supermodule.git:

# Checkout supermodule
export GIT_WORK_TREE=/var/www/supermodule git checkout -f

# Determine submodule version
submodule_version=$(git ls-tree HEAD assets/submodule | awk '{print $3}')

# Checkout submodule
export GIT_DIR=/opt/repos/submodule.git
export GIT_WORK_TREE=/var/www/supermodule/assets/submodule
git checkout -f $submodule_version

Может быть более простое решение (например, взломать команду git submodule update с некоторыми переменными среды), но я часто использую git ls-tree для определенияссылка на версию субмодуля в любом случае.

Если вы переместите субмодули на другой сервер, вы все равно можете использовать это решение с небольшой модификацией:

  • Клонировать подмодуль в /opt/repos/submodule.git нацелевой сервер
  • Добавить команду git fetch перед git checkout

Таким образом, результат будет следующим:

# Checkout submodule
export GIT_DIR=/opt/repos/submodule.git
export GIT_WORK_TREE=/var/www/supermodule/assets/submodule
git fetch
git checkout -f $submodule_version
...