Git субмодуль на удаленном голом - PullRequest
23 голосов
/ 26 февраля 2012

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

$ mkdir ~/website.git && cd ~/website.git
$ git init --bare

И

$ cat > hooks/post-receive

#!/bin/sh
GIT_WORK_TREE=/var/www/website git checkout -f

$ chmod +x hooks/post-receive

И в моей местной среде:

$ git remote add web ssh://website.com/home/website.git
$ git push web +master:refs/heads/master

Теперь я могу развернуться на этом пульте, используя git push web, и все отлично работает ..

Проблема: субмодули

У меня есть несколько подмодулей в моем проекте, которые не инициализируются / не обновляются в удаленном хранилище ... Я не могу запустить git submodule update на голом, потому что он пуст, и я могу не запускайте его в папке /var/www/website, потому что это просто копия файлов, а не git-репозиторий.

Ответы [ 3 ]

9 голосов
/ 25 июля 2015

Я нашел другое решение, которое кажется мне довольно чистым. Просто предоставьте git всю информацию, необходимую для выполнения субмодуля:

$ cd /path/to/your/git_work_tree
$ git --git-dir=/path/to/your/bare_repo.git --work-tree=. submodule init
$ git --git-dir=/path/to/your/bare_repo.git --work-tree=. submodule update
9 голосов
/ 26 февраля 2012

Один из возможных способов может быть:

Другими словами:
Вытяните из чистого репо вместо попытки извлечения из чистого репо: непогашенное репо должно быть в состоянии затем выполнить шаг git submodule update.

Пример сценария может выглядеть как

#!/bin/sh

# Get the latest code
cd /path/to/bare/repo

# Set git variables
GIT_WORK_TREE=/var/www/website
GIT_DIR=/var/www/website/.git

# Go to website and pull
cd /var/www/website
git pull /path/to/bare/repo
git submodule update --init --recursive

# Run additional build stuff here
6 голосов
/ 07 декабря 2012

Я наткнулся на эту тему два дня назад, пока боролся с той же проблемой. Наконец, придя к хорошему и аккуратному решению, я написал статью об этом здесь:

Git push с подмодулями: руководство по эксплуатации

Я понял, что если я собираюсь push в голое репо, только чтобы использовать post-receive до pull в не голом репо, я мог бы просто сделать его простым и напрямую push в не голое хранилище. Это явный случай, когда «лучшая практика» только продвигаться к голому репо только добавляет сложности.

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


Во-первых, давайте создадим универсальный post-receive хук, который мне не нужно менять для каждого хранилища:

[aaron@aaronadams]$ cat > /usr/local/share/git-core/templates/hooks/post-receive.sample
#!/bin/sh
#
# An example hook script to update the working tree, including its
# submodules, after receiving a push.
#
# This hook requires core.worktree to be explicitly set, and
# receive.denyCurrentBranch to be set to false.
#
# To enable this hook, rename this file to "post-receive".

# Read standard input or hook will fail
while read oldrev newrev refname
do
:
done

# Unset GIT_DIR or the universe will implode
unset GIT_DIR

# Change directory to the working tree; exit on failure
cd `git config --get core.worktree` || exit

# Force checkout
git checkout --force

# Force update submodules
git submodule update --init --recursive --force
[aaron@aaronadams]$ chmod +x /usr/local/share/git-core/templates/hooks/post-receive.sample

Теперь давайте пойдем и нарушим все правила.

Мы собираемся инициализировать non-bare Git-репозиторий прямо в каталоге нашего сайта; убедитесь, что он может получать от git push; явно установить его рабочее дерево в родительский каталог; и включите наш хук, который мы только что создали.

[aaron@aaronadams]$ cd /var/www/vhosts/aaronadams.ca/sites/staging.aaronadams.ca
[aaron@aaronadams]$ git init && git config --bool receive.denyCurrentBranch false && git config --path core.worktree ../ && mv .git/hooks/post-receive.sample .git/hooks/post-receive
Initialized empty Git repository in /var/www/vhosts/aaronadams.ca/sites/staging.aaronadams.ca/.git/

Наконец, на нашем локальном компьютере мы изменим наш пульт, чтобы отразить местоположение нашего нового хранилища, и нажмем.

[aaron@aaronadams]$ git remote set-url staging aaron@aaronadams.ca:sites/staging.aaronadams.ca
[aaron@aaronadams]$ git push staging master
remote: Submodule 'codeigniter' (git://github.com/EllisLab/CodeIgniter.git) registered for path 'codeigniter'
remote: Cloning into 'codeigniter'...
remote: Submodule path 'codeigniter': checked out 'fd24adf31255822d6aa9a5d2dce9010ad2ee4cf0'
To aaron@aaronadams.ca:sites/staging.aaronadams.ca
 * [new branch]      master -> master

Святое дерьмо, это сработало!

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


Надеюсь, этот ответ кому-нибудь поможет так же, как и все остальные посты об обмене стеками за последние два дня!

...