Usando git como herramienta de deployment

Estoy tratando de usar git como una herramienta de implementación, por lo que cuando haya habido un impulso en la twig de producción, quiero actualizar el server remoto en consecuencia. Sin embargo, cuando ejecuto el segundo command (la extracción) vuelve con un error que dice Operation must be run in a work tree. ¿Alguien puede señalarme en la dirección correcta?

Aquí hay una muestra parcial del script bash.

 echo -e "Thank you for pushing your changes to ${project}. \nHold on while I update the requinetworking directories..." GIT_WORK_TREE=/home/www/${project} git checkout -f echo "Local directory updated!" for ref in $@; do echo $ref if [ "$ref" = "refs/heads/production" ]; then # Before we could set the GIT directory strictly from the local environment # but the case might not be the same remotely. Need absolute paths. ssh git@myserver GIT_DIR=/home/www/${project}/.git GIT_WORK_TREE=/home/www/${project} git checkout -f production ssh git@myserver.com GIT_DIR=/home/www/${project}/.git GIT_WORK_TREE=/home/www/${project} git pull -f production echo "Production push completed" fi done 

EDITAR:

Aquí está el error de copy pegada:

remote: fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.

Como @meagar dijo que suena como que el repository clonado en el server remoto fue clonado con la opción --bare . Vuelva a clonarlo sin esta opción para get una copy normal de "directory de trabajo", como la que tiene localmente.

Entonces ahora deberías tener:

  • su repository local
  • un repository desnudo en el server
  • uno normal en el server (clonado desde el descubierto)

Con esto en mente, ahora puede crear un gancho post-recepción que se ejecuta cada vez que se empuja algo al depósito desnudo. Enganches en vivo (en el server) en la carpeta de ganchos del repository desnudo (hay muestras allí para varios casos).

 #!/bin/bash while read oldrev newrev refname do if [ "$refname" == "refs/heads/master" ]; then WORKDIR=/path/to/checked/out/repository export GIT_DIR=$WORKDIR/.git pushd $WORKDIR >/dev/null git pull --quiet >/dev/null # run some scripts in the checked out repository popd >/dev/null fi done 

Esta secuencia de commands busca específicamente una inserción en la twig principal, pero puede cambiarse fácilmente a otra twig o eliminarse por completo. A continuación, cambia al directory de trabajo de su repository verificado y realiza un jalón. Una vez que finalice la extracción, puede ejecutar cualquier otro command útil de bash.

Parece que el repository que considera "implementado" es un repository simple. Debería clonar su repository sin --bare y volver a intentarlo.