2010-09-16 2 views
40

У нас есть сайт, на котором есть все его файлы PHP/HTML/JS/CSS/etc, хранящиеся в репозитории Git.Git push to live server

В настоящее время у нас есть 3 типа компьютеров (или прецедентов) для хранилища.

  • Местный разработчик: тянуть последние изменения, вносить изменения, совершить местный репозиторий, нажмите на главный сервер
  • Основной сервер: центральное хранилище, все изменения, получить толкнул к главному серверу
  • веб-сервера: изменения снесены с главного сервера при развертывании веб-сайта

Так в настоящее время мы:

local: git push origin master 
local: password: ******** 
local: ssh [email protected] 
webserver: password: ******** 
webserver: cd ~/domain.com/ 
webserver: git pull origin master 

Итак, мой вопрос: есть ли способ, который с моего локального компьютера я могу нажать прямо на веб-сервер?

ie.

local: git push origin master 
local: password: ******** 
local: git push webserver master 
local: password: ******** 
+0

возможно дубликат [Развертывание проекта с помощью Git толчок ] (http://stackoverflow.com/questions/279169/deploy-a-project-using-git-push). Хорошей возможностью является [git config receive.denyCurrentBranch updateInstead] (http://stackoverflow.com/a/28381235/895245) на пульте дистанционного управления. –

ответ

10

Посмотрите на мерзавца URLS часть http://www.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git-push.html

так что вы бы попробовать:

git push ssh://[email protected]/~admin/domain.com/ master 

ДОБАВЛЕНО: Я думаю, что часть того, что вы просите, как иметь несколько удаленных хранилищ ,

git remote add webserver ssh://[email protected]/~admin/domain.com/ 

, что позволяет запускать:

git push origin master 
    git push webserver master 
+1

Проблема в том, что push и pull не являются взаимозаменяемыми. Нажатие на репо не изменяет рабочую ветвь. – cmcginty

+0

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

+0

В своем текущем рабочем процессе «git pull origin master» – cmcginty

4

Я думаю, что функция, которую Вы ищете, описано здесь: http://debuggable.com/posts/git-tip-auto-update-working-tree-via-post-receive-hook:49551efe-6414-4e86-aec6-544f4834cda3

От local вы можете добавить веб-сервер в качестве пульта дистанционного управления, так же, как вы бы сделали любое другое:

git remote add webserver [email protected]:/path/to/repo.git/ 
# push only master branch by default 
git config remote.webserver.push master 

Теперь, когда вы читаете у толкать вы можете просто сделать:

git push webserver 
33

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

http://git-scm.com/docs/githooks

Этот скрипт мог бы, в свою очередь входа на веб-сервер через SSH и сделать

cd ~/domain.com/ 
git checkout master 
git pull origin master 

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

Я даже нашел для вас хорошую статью о входе в систему через ssh в скрипте (если вы должны использовать пароль, это тривиально, если был установлен ssh-ключ) :

http://bash.cyberciti.biz/security/expect-ssh-login-script/

Надеется, что это помогает!

28

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

TL; DR, git init --bare, чтобы создать новое репо на вашем веб-сервере, на котором вы будете перенаправлять свои изменения с вашей машины-разработчика. Когда веб-репо получает ваши изменения, он запускает крюк post-receive, который затем копирует файлы в ваш веб-корень.

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

Примечание: вам нужно запустить git config receive.denycurrentbranch ignore на вашем сервере, чтобы пресечь предупреждение в локальной панели разработчиков при нажатии.

+0

Howto отлично поработал для меня. потому что я работал в одном каталоге сервера на другой, мне нужно было супо пользователю в файле post-receive. 'sudo -u -H sh -c" GIT_WORK_TREE =/путь/в/жить git checkout -f "' –

0

Перед развертыванием локальных изменений проверьте, не изменилось ли что-либо на целевом сервере.

Добавить в сценарии развертывания, чтобы гарантировать, что ничего не изменилось на сервере:

$ git ls-files -dmo --exclude-standard 

будет пустым, если есть неизмененные файлы, легче, чем разбор состояния GIT