2010-09-16 24 views
40

Tenemos un sitio web que tiene todos sus archivos PHP/HTML/JS/CSS/etc. almacenados en un repositorio de Git.Git push to live server

Actualmente tenemos 3 tipos de computadoras (o casos de uso) para el repositorio.

  • desarrollador local: tire últimos cambios, hacer cambios, se comprometen a repo local empujar al servidor maestro
  • servidor maestro: repositorio central, todos los cambios se inserta en el servidor maestro
  • servidor web: los cambios son tirado hacia abajo desde el servidor maestro al desplegar la página web

Así actualmente:

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

Entonces mi pregunta es: ¿hay alguna forma de que desde mi computadora local pueda ingresar directamente al servidor web?

es decir.

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

posible duplicado de [Implementar un proyecto usando git push ] (http://stackoverflow.com/questions/279169/deploy-a-project-using-git-push). Una buena posibilidad es [git config receive.denyCurrentBranch updateInstead] (http://stackoverflow.com/a/28381235/895245) en el control remoto. –

Respuesta

10

Mira el git URLs parte de http://www.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git-push.html

por lo que intentaría:

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

añadido: Creo que parte de lo que está pidiendo es cómo tener múltiples repositorios remotos .

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

que le permite ejecutar:

git push origin master 
    git push webserver master 
+1

El problema es que empujar y tirar no son intercambiables. Empujar a un repositorio no modificará la rama de trabajo. – cmcginty

+0

@Casey, si lees la pregunta, solo está preguntando cómo presionar, no menciona intentar actualizar el árbol de trabajo. Probablemente tengas razón sobre lo que intenta hacer, pero el voto a la baja parece ser un poco duro por tomar su pregunta al pie de la letra. –

+0

En la pregunta, su flujo de trabajo actual es "maestro de origen de git pull" – cmcginty

4

Creo que la función que está buscando se describe aquí: http://debuggable.com/posts/git-tip-auto-update-working-tree-via-post-receive-hook:49551efe-6414-4e86-aec6-544f4834cda3

De local puede agregar el servidor web como un control remoto, al igual harías cualquier otro:

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

Ahora cuando leas Y para empujar simplemente puede hacer:

git push webserver 
33

sí se puede empujar directamente a su servidor web, pero yo no lo recomiendo ya que sólo debe empujar a los repositorios clonados con el argumento --bare. Utilizaría el sistema git hook para que el repositorio principal actualice automáticamente el repositorio en el servidor web. Echa un vistazo a la posterior a la actualización gancho en:

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

Este script podría a su vez de inicio de sesión al servidor web a través de ssh y hacer

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

De esta manera sólo necesita concentrarse en empujar al servidor central y no tiene que preocuparse por el servidor web, siempre se actualizará una vez que se haya realizado un envío.Si puedes automatizar algo, entonces automatízalo :)

Incluso encontré un buen artículo para ti sobre el inicio de sesión a través de ssh en un script (si debes usar la contraseña, esto es trivial si se configuró una ssh-key) :

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

Espero que esto ayude!

28

Tuve la misma consulta y no estoy satisfecho con la respuesta más votados actualmente aquí, terminé siguiendo a git-website-howto, que describe el proceso bastante bien y es IMO un enfoque mucho más limpio y rápido.

TL; DR, git init --bare para crear un repositorio nuevo en su servidor web en el que realizará los cambios desde su máquina de desarrollo. Cuando el repo web recibe sus cambios, activa el gancho post-recepción que luego copia los archivos a su raíz web.

Me gusta este enfoque porque el gancho post-recepción hace el trabajo en su servidor para que su máquina local pueda empujar mucho más rápido y liberarse. Esto también hace que sea muy fácil configurar el seguimiento remoto para una rama en particular. Por lo tanto, podría tener una sucursal llamada production para actualizar su servidor web, mientras que su maestro seguirá siendo para el desarrollo y vincular a su repositorio git en otro lugar.

Nota: necesitará ejecutar git config receive.denycurrentbranch ignore en su repositorio de servidor web para suprimir una advertencia en su cuadro dev local al presionar.

+0

el howto funcionó muy bien para mí. porque estaba trabajando en un directorio del servidor con otro, necesitaba sudo un usuario en el archivo 'post-receive'. 'sudo -u -H sh -c" GIT_WORK_TREE =/ruta/a/live git checkout -f "' –

0

Antes de implementar los cambios locales, verifique si algo ha cambiado en el servidor de destino.

Añadir al script de implementación para asegurar que nada ha cambiado en el servidor:

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

estará vacía si hay archivos no modificados, más fácil de analizar git status