Push git ветви непосредственно в каталог live server, так что файлы видны в реальном времени


Как я могу настроить удаленные каталоги в Git, где я могу локально толкать ветку этапа к удаленному и видеть текущие изменения на промежуточном сервере, например stage.example.com?

Идея, которую я имею (часть того, почему я удаляюсь от SVN), состоит в том, что я могу поддерживать (локально) 3 различных" главных " ветви следующим образом:

  • master - используется для локального развития, рабочий реж
  • этап - должен быть синхронизирован с каталогом промежуточного сервера (удаленный)
  • live - это должен быть общедоступный веб-сайт (удаленный)
Идея, которую я имею (и то, что другие утверждают, возможно), заключается в том, что я могу поддерживать эти удаленные "сайты" с моего локального компьютера без необходимости постоянно входить в мою удаленную серверную оболочку и запускать svn update (в моем текущем рабочем процессе svn мне нужно делать это все время...) или, конечно, в моем рабочем процессе Git запускать git pull на удаленном компьютере.

Как настроить удаленные каталоги, чтобы я мог локально нажмите мою ветвь stage на staging remote server и посмотрите изменения на (например) stage.example.com прямо сейчас?

Затем, как только stage будет все в порядке и протестировано, я просто локально смогу push на live удаленный внести эти изменения, которые я протестировал на stage на веб-сайте live.

Можно ли это вообще сделать, или я получаю здесь сумасшедшие идеи, которые просто не предназначены для Git?

В случае, если это важно, вот несколько статистических данных о моем местном и удаленные серверы:

remote server:      Dreamhost (shared account)
remote GIT version: 1.7.1.1
remote GIT client:  shell

local computer:     Mac Pro (Snow Leopard 10.6.6)
local GIT version:  1.7.2.3
local GIT client:   Tower.app // git-tower.com

Кроме того, до сих пор я безуспешно пытался выполнить следующий рабочий процесс:

  1. создайте --bare git repo на пульте дистанционного управления (чтобы я мог получить к нему доступ отовсюду)
  2. клонируйте это удаленное РЕПО в локальный каталог и используйте приложение Git Tower для управления им
  3. работайте локально в master (HEAD)
  4. scp -r копирования --bare Git репозитория с удаленного сервера на мой домен удаленного живут stage.example.com
  5. добавьте удаленную рабочую копию в локальную, а затем попробуйте нажать на origin/stage
Ясно, что это не работает, но я не знаю, почему или как это сделать лучше.

Исходя из фона SVN, я новичок в Git, но смотрел много учебников (Peepcode & ThinkVitamin), но все еще не могу понять, как это настроить.

1 10

1 ответ:

Единственное понятие, которое можно реализовать с помощью DVCS ("распределенных" VCS, таких как Git или Mercurial), заключается в том, что он добавляет понятие публикации (push / pull) к понятию ветвления.
В ЦВК ("централизованной" системы контроля версий, например, SVN) имеет ветвление (и один центральный РЕПО для передачи на сервер).

В вашем случае staging или live-это шаги публикации, то есть различные РЕПО Git, готовые к получению изменений, которые вы хотите видеть в staging или в live среде.

Что означало бы:

Разница между post-receive и post-update крюком состоит в том, что post-update выполняется один раз для каждой модифицированной ветви:
Смотрите " git-хук для обновления различных веб-папок на основе ветки, перемещенной на удаленный сервер ".

На начальном толчке, сделайте "git push --all origin " и все ветви будут созданы на удаленном голом РЕПО.

Идея заключается в том, что на стороне сервера не должно быть никакого вытягивания: только git --work-tree=/path/to/your/live/files/ checkout live или git --work-tree=/path/to/your/staging/files/ checkout staging, в зависимости от параметров крючка после обновления: вы только извлекаете файлы голого РЕПО в эти "папки" на сервере.

Если вы делаете сценарий ruby для вашего крючка, убедитесь, что:

  • используйте правый shebang: #!/usr/bin/env ruby,
  • окружить команду git с помощью backtick должно быть достаточно: `git ...`, как в этом сценарии ,
  • использование ENV['HOME'] для указания homedir текущего пользователя в указанном скрипте, если вы хотите, чтобы команды, такие как `cd ~/stagedomain.com` или `--work-tree=~/stagedomain.com` работали (с `~`, установленным на правильный путь),
  • Если вы выбрали git pull, снимите GIT_DIR на той же строке, что и другие команды , как в другом вопросе: `cd ~/stage.mydomain.com && unset GIT_DIR && git pull core stage`.