Implementar un proyecto usando Git push

Resuelto Kyle Cronin asked hace 15 años • 19 respuestas

¿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 tarea git reset --harden el lado del servidor, pero ¿cómo haría para lograr esto?

Kyle Cronin avatar Nov 11 '08 04:11 Kyle Cronin
Aceptado

Encontré este script en este sitio y parece funcionar bastante bien.

  1. Copie su directorio .git a su servidor web
  2. En su copia local, modifique su archivo .git/config y agregue su servidor web como remoto:

    [remote "production"]
        url = username@webserver:/path/to/htdocs/.git
    
  3. En el servidor, reemplace .git/hooks/post-update con este archivo (en la respuesta a continuación)

  4. Agregue acceso de ejecución al archivo (nuevamente, en el servidor):

    chmod +x .git/hooks/post-update
    
  5. Ahora, simplemente envíelo localmente a su servidor web y debería actualizar automáticamente la copia de trabajo:

    git push production
    
Kyle Cronin avatar Nov 29 '2008 07:11 Kyle Cronin

Usando el archivo posterior a la actualización a continuación:

  1. Copie su directorio .git a su servidor web
  2. En su copia local, modifique su archivo .git/config y agregue su servidor web como remoto:

    [remote "production"]
        url = username@webserver:/path/to/htdocs/.git
    
  3. En el servidor, reemplace .git/hooks/post-update con el siguiente archivo

  4. Agregue acceso de ejecución al archivo (nuevamente, en el servidor):

    chmod +x .git/hooks/post-update
    
  5. Ahora, simplemente envíelo localmente a su servidor web y debería actualizar automáticamente la copia de trabajo:

    git push production
    
#!/bin/sh
#
# This hook does two things:
#
#  1. update the "info" files that allow the list of references to be
#     queries over dumb transports such as http
#
#  2. if this repository looks like it is a non-bare repository, and
#     the checked-out branch is pushed to, then update the working copy.
#     This makes "push" function somewhat similarly to darcs and bzr.
#
# To enable this hook, make this file executable by "chmod +x post-update". 
git-update-server-info 
is_bare=$(git-config --get --bool core.bare) 
if [ -z "$is_bare" ]
then
      # for compatibility's sake, guess
      git_dir_full=$(cd $GIT_DIR; pwd)
      case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac
fi 
update_wc() {
      ref=$1
      echo "Push to checked out branch $ref" >&2
      if [ ! -f $GIT_DIR/logs/HEAD ]
      then
             echo "E:push to non-bare repository requires a HEAD reflog" >&2
             exit 1
      fi
      if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null)
      then
             wc_dirty=0
      else
             echo "W:unstaged changes found in working copy" >&2
             wc_dirty=1
             desc="working copy"
      fi
      if git diff-index --cached HEAD@{1} >/dev/null
      then
             index_dirty=0
      else
             echo "W:uncommitted, staged changes found" >&2
             index_dirty=1
             if [ -n "$desc" ]
             then
                   desc="$desc and index"
             else
                   desc="index"
             fi
      fi
      if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ]
      then
             new=$(git rev-parse HEAD)
             echo "W:stashing dirty $desc - see git-stash(1)" >&2
             ( trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT
             git-update-ref --no-deref HEAD HEAD@{1}
             cd $GIT_WORK_TREE
             git stash save "dirty $desc before update to $new";
             git-symbolic-ref HEAD "$ref"
             )
      fi 
      # eye candy - show the WC updates :)
      echo "Updating working copy" >&2
      (cd $GIT_WORK_TREE
      git-diff-index -R --name-status HEAD >&2
      git-reset --hard HEAD)
} 
if [ "$is_bare" = "false" ]
then
      active_branch=`git-symbolic-ref HEAD`
      export GIT_DIR=$(cd $GIT_DIR; pwd)
      GIT_WORK_TREE=${GIT_WORK_TREE-..}
      for ref
      do
             if [ "$ref" = "$active_branch" ]
             then
                   update_wc $ref
             fi
      done
fi
Darío Javier Cravero avatar Aug 02 '2010 10:08 Darío Javier Cravero

Después de muchos comienzos en falso y callejones sin salida, finalmente puedo implementar el código del sitio web con solo "git push remoto " gracias a este artículo .

El script posterior a la actualización del autor tiene solo una línea y su solución no requiere la configuración de .htaccess para ocultar el repositorio de Git como lo hacen otros.

Un par de obstáculos si implementa esto en una instancia de Amazon EC2;

1) Si usa sudo para crear el repositorio de destino básico, 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 configura previamente la ubicación de su clave privada de Amazon .pem, ya sea en /etc/ssh/ssh_config como un parámetro de IdentityFile o en ~/.ssh/config usando el comando "[ Host] - Nombre de host - Archivo de identidad - Diseño de usuario "que se describe aquí ...

... SIN EMBARGO, si el Host está configurado en ~/.ssh/config y es diferente al Nombre del Host, la inserción de Git fallará. (Probablemente sea un error de Git)

Earl Zedd avatar Mar 03 '2011 06:03 Earl Zedd