Толкая дерево исходников Git, а не просто хранилище - PullRequest
5 голосов
/ 12 октября 2009

Я использую Git неправильно. Я хочу использовать это правильно.

Вот что у меня есть:

Здесь, на моей машине для разработки, находится Git-репозиторий, который я фиксирую и проверяю.

Мой веб-сервер находится там, где будет развернут этот код. У веб-сервера есть еще одно хранилище git, к которому я могу перейти через SSH, когда я буду готов к развертыванию.

Я хочу иметь представление о репозитории Git, в котором всегда есть последние версии исходных файлов (в некоторой ветке или с некоторым тегом).

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

Есть ли способ сделать «удаленный доступ к веб-серверу и обновить его извлеченные файлы, если я обещаю, что не редактировал никаких файлов на веб-сервере»?

Или я просто делаю это так неправильно, ты хочешь дать мне пощечину? : -)

Ответы [ 3 ]

7 голосов
/ 13 октября 2009

Я обычно создаю непокрытое хранилище с файлом .git / hooks / post-receive, содержащим

#!/bin/sh
cd ..
env -i git reset --hard

Этот файл должен быть исполняемым, а ветвь должна быть извлечена.

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

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

git config receive.denyCurrentBranch ignore

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

Я нашел там подсказку: http://debuggable.com/posts/git-tip-auto-update-working-tree-via-post-receive-hook:49551efe-6414-4e86-aec6-544f4834cda3

7 голосов
/ 12 октября 2009

крючки может быть то, что вы ищете.

Вы создаете зацепку после получения. И он будет выполняться на сервере после каждого нажатия. Затем вы делаете второй репозиторий и вы всегда будете в курсе:)

1 голос
/ 13 октября 2009

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

Чтобы иметь доступ на чтение / запись с веб-сервера, мой пользователь git также находится в группе www-data, а корневым веб-каталогом был chmod ug + rwx, g + s, поэтому новые созданные файлы получат владение группой. , Umask гарантирует, что у группы есть доступ на чтение / запись, потому что Git использует umask по умолчанию, который обычно равен 0022 (документация говорит об использовании собственного umask в конфигурации, но у меня это никогда не работало)

#!/bin/bash
# post-update hook

WEB_DIR="/var/www/myweb"
pushd $WEB_DIR > /dev/null
export GIT_DIR="$WEB_DIR/.git"
umask 0007
git pull
popd > /dev/null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...