¿Es posible implementar un sitio web usando git push
? Tengo el presentimiento de que tiene algo que ver con el uso de git hooks para realizar una operación git reset --hard
en el lado del servidor, pero ¿cómo podría lograr esto?
git
deployment
webserver
githooks
Kyle Cronin
fuente
fuente
Respuestas:
Encontré este script en este sitio y parece funcionar bastante bien.
En su copia local, modifique su archivo .git / config y agregue su servidor web como control remoto:
En el servidor, reemplace .git / hooks / post-update con este archivo (en la respuesta a continuación)
Agregue acceso de ejecución al archivo (nuevamente, en el servidor):
Ahora, solo presione localmente a su servidor web y debería actualizar automáticamente la copia de trabajo:
fuente
Usando el archivo posterior a la actualización a continuación:
En su copia local, modifique su archivo .git / config y agregue su servidor web como control remoto:
En el servidor, reemplace .git / hooks / post-update con el archivo a continuación
Agregue acceso de ejecución al archivo (nuevamente, en el servidor):
Ahora, solo presione localmente a su servidor web y debería actualizar automáticamente la copia de trabajo:
fuente
Después de muchos falsos comienzos y callejones sin salida, finalmente puedo implementar el código del sitio web con solo "git push remote " gracias a este artículo .
El script posterior a la actualización del autor solo tiene una línea de largo y su solución no requiere la configuración .htaccess para ocultar el repositorio de Git como lo hacen otros.
Un par de obstáculos si está implementando esto en una instancia de Amazon EC2;
1) Si usa sudo para crear el repositorio de destino desnudo, debe cambiar el propietario del repositorio a ec2-user o la inserción fallará. (Pruebe "chown ec2-user: ec2-user repo ").
2) La inserción fallará si no preconfigura la ubicación de su .pem amazon-private-key , ya sea en / etc / ssh / ssh_config como un parámetro IdentityFile o en ~ / .ssh / config usando "[ Host] - HostName - IdentityFile - Usuario "diseño descrito aquí ...
... SIN EMBARGO si el Host está configurado en ~ / .ssh / config y diferente de HostName, la inserción de Git fallará. (Eso es probablemente un error de Git)
fuente
no instale git en un servidor ni copie la carpeta .git allí. para actualizar un servidor desde un clon de git puede usar el siguiente comando:
Es posible que deba eliminar los archivos que se eliminaron del proyecto.
esto copia todos los archivos registrados. rsync usa ssh que está instalado en un servidor de todos modos.
cuanto menos software haya instalado en un servidor, más seguro será y más fácil será administrar su configuración y documentarla. tampoco es necesario mantener un clon git completo en el servidor. solo hace que sea más complejo asegurar todo correctamente.
fuente
En esencia, todo lo que necesita hacer es lo siguiente:
Tengo esas líneas en mi aplicación como un ejecutable llamado
deploy
.Entonces, cuando quiero hacer una implementación, escribo
./deploy myserver mybranch
.fuente
ssh -A ...
git pull
debe evitar el uso de implementaciones automáticas porque la parte de fusión podría requerir una limpieza manual en caso de conflicto.La forma en que lo hago es que tengo un repositorio Git en mi servidor de implementación donde empujo los cambios. Luego inicio sesión en el servidor de implementación, cambio al directorio de documentos del servidor web real y hago un git pull. No uso ningún gancho para intentar hacer esto automáticamente, eso parece más problemas de lo que vale.
fuente
git reset
para retroceder entre los últimos cambios (todas las confirmaciones, no solo toda la extracción). Si necesita revertir algo específico que no sea el último commit, entonces puede usarlo,git revert
pero probablemente debería usarse solo en emergencias (git revert
crea un nuevo commit que deshace el efecto de algún commit anterior).git config --local receive.denyCurrentBranch updateInstead
Agregado en Git 2.3, esta podría ser una buena posibilidad: https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155
Lo configura en el repositorio del servidor y también actualiza el árbol de trabajo si está limpio.
Ha habido nuevas mejoras en 2.4 con el
push-to-checkout
gancho y el manejo de ramas no nacidas .Uso de la muestra:
Salida:
Esto tiene las siguientes deficiencias mencionadas en el anuncio de GitHub :
Pero todos esos puntos están fuera del alcance de Git y deben ser atendidos por código externo. Entonces, en ese sentido, esto, junto con los ganchos Git, son la solución definitiva.
fuente
Actualización: ahora estoy usando la solución Lloyd Moore con el agente clave
ssh -A ...
. Empujar a un repositorio principal y luego tirar de él en paralelo desde todas sus máquinas es un poco más rápido y requiere menos configuración en esas máquinas.No veo esta solución aquí. simplemente presione a través de ssh si git está instalado en el servidor.
Necesitará la siguiente entrada en su .git / config local
Pero oye, ¿qué pasa con eso
amazon:
? En su configuración local de ~ / .ssh / deberá agregar la siguiente entrada:ahora puedes llamar
(Por cierto: /path/to/project.git es diferente al directorio de trabajo real / ruta / a / proyecto)
fuente
Para el escenario de implementación
En nuestro escenario, estamos almacenando el código en github / bitbucket y queremos implementarlo en servidores activos. En este caso, la siguiente combinación funciona para nosotros (que es un remix de las respuestas altamente votadas aquí) :
.git
directorio a su servidor webgit remote add live ssh://user@host:port/folder
git config receive.denyCurrentBranch ignore
En remoto:
nano .git/hooks/post-receive
y agregue este contenido:#!/bin/sh GIT_WORK_TREE=/var/www/vhosts/example.org git checkout -f
En remoto:
chmod +x .git/hooks/post-receive
git push live
Notas
Si su
.git
carpeta está dentro de la raíz del documento, asegúrese de ocultarla desde el exterior agregando a.htaccess
( fuente ):RedirectMatch 404 /\..*$
fuente
Utilizamos capistrano para gestionar la implementación. Construimos capistrano para implementar en un servidor provisional, y luego ejecutamos un rsync con todo nuestro servidor.
Con capistrano, podemos hacer una reversión fácil en caso de error
fuente
Giddyup son ganchos de git de solo agregar agua independientes del lenguaje para automatizar la implementación a través de git push. También le permite tener enganches de inicio / parada personalizados para reiniciar el servidor web, calentar el caché, etc.
https://github.com/mpalmer/giddyup
Mira ejemplos .
fuente
Parece que debería tener dos copias en su servidor. Una copia simple, de la que puede empujar / extraer, desde la cual empujaría sus cambios cuando haya terminado, y luego clonaría esto en su directorio web y configuraría un cronjob para actualizar git pull desde su directorio web todos los días o entonces.
fuente
Podrías configurar un git hook que cuando digamos que se realiza un commit para decir la rama "estable", extraerá los cambios y los aplicará al sitio PHP. El gran inconveniente es que no tendrá mucho control si algo sale mal y agregará tiempo a sus pruebas, pero puede tener una idea de cuánto trabajo involucrará cuando se fusiona, por ejemplo, para saber cuál es su rama troncal en la rama estable. cuántos conflictos puede encontrar. Será importante vigilar los archivos que son específicos del sitio (por ejemplo, archivos de configuración) a menos que solo tenga la intención de ejecutar un solo sitio.
Alternativamente, ¿ha buscado empujar el cambio al sitio?
Para obtener información sobre git hooks, consulte la documentación de githooks .
fuente
Mi opinión sobre la solución de los cristianos .
fuente
Estoy usando la siguiente solución de toroid.org , que tiene un script de gancho más simple.
en el servidor:
e instale el gancho en el servidor:
en su cliente:
luego para publicar, simplemente escriba
Hay una descripción completa en el sitio web: http://toroid.org/ams/git-website-howto
fuente
git push web +master:refs/heads/master
lugar de sologit push web master
?Como respuesta complementaria, me gustaría ofrecer una alternativa. Estoy usando git-ftp y funciona bien.
https://github.com/git-ftp/git-ftp
Fácil de usar, solo escriba:
y git cargará automáticamente los archivos del proyecto.
Saludos
fuente
Dado un entorno en el que tiene múltiples desarrolladores accediendo al mismo repositorio, las siguientes pautas pueden ayudar.
Asegúrese de tener un grupo Unix al que pertenezcan todos los desarrolladores y otorgue la propiedad del repositorio .git a ese grupo.
En el .git / config del repositorio del servidor establezca sharedrepository = true. (Esto le dice a git que permita que múltiples usuarios sean necesarios para las confirmaciones y la implementación.
configura la umask de cada usuario en sus archivos bashrc para que sea la misma - 002 es un buen comienzo
fuente
Terminé creando mi propia herramienta de implementación rudimentaria que automáticamente desplegaría nuevas actualizaciones del repositorio - https://github.com/jesalg/SlimJim - Básicamente escucha el github post-reciben-hook y usa un proxy para activar un script de actualización
fuente
Utilizo dos soluciones para el gancho posterior a la recepción:
IMPLEMENTAR SOLUCIÓN 1
IMPLEMENTAR SOLUCIÓN 2
Ambas soluciones se basan en soluciones anteriores disponibles en este hilo.
Tenga en cuenta que BRANCH_REGEX = '^ $ {GIT_BRANCH1}. $ 'filtros para los nombres de rama que coinciden con "master cadena " o "dev *", y despliega el árbol de trabajo, si la rama empujada coincide. Esto hace posible implementar una versión de desarrollo y una versión maestra en diferentes lugares.
SOLUCIÓN DE IMPLEMENTACIÓN 1 elimina solo los archivos, que forman parte del repositorio, y se eliminó mediante una confirmación. Es más rápido que la Solución de implementación 2.
DEPLOY SOLUTION 2 tiene la ventaja de que eliminará cualquier archivo nuevo del directorio de producción, que se agregó en el lado del servidor, sin importar si se agregó al repositorio o no. Siempre estará limpio el engaño del repositorio. Es más lento que la Solución de implementación 1.
fuente