2010-01-29 9 views
5

Estoy usando git para administrar un proyecto de grails que tengo. Configuré un repositorio git en un servidor remoto y lo que quiero hacer es cuando el código esté funcionando localmente, quiero confirmarlo y enviarlo al servidor remoto. Quiero que el archivo groovy y los gsp actualizados se coloquen en el lugar correcto en el servidor remoto para que los griales capten los cambios para las pruebas remotas. es posible?¿Cómo controlo los archivos para compilar con git?

+0

¿Estás usando linux, mac o windows? – Alos

+0

El servidor remoto es linux, localmente tengo una máquina de Windows (que usa tortity git) y también tengo un mac. Así que estoy sincronizando el código entre esas máquinas a través del control remoto, pero me gustaría que el control remoto tenga una versión activa de la aplicación Grails que se actualiza al presionar. – TripWired

+0

Acabo de agregar algunas sugerencias como comentarios a mi respuesta para su ejecución 'post-update'. Ver el último enlace de ese comentario primero. – VonC

Respuesta

6

Si está presionando a un repositorio remoto, donde "parece que solo contiene un paquete grande" archivo, no código fuente real "(como detallas en los comentarios), eso debería significar" bare repo ", que es bueno porque te permite enviar sin ningún riesgo de diferencias entre un árbol de trabajo y los datos de git.

Luego, como se describe en "Can I use git to keep a remote server up to date?", otro repositorio (no perecedero) y post-update hook en el lado repo al descubierto lo llevarán a donde lo desee.


El PO TripWired añade:

Bueno por lo que lo que hice es:

  • crear el repositorio desnudo para registrarse a continuación
  • creé otra repo que era estándar, básicamente tengo ~/project.git y ~/project.
  • cloné project.git en project y en project.git/hooks/post-update puse:

    cd ../../project env -i git checkout. env -i git pull

También se aseguró de que después de la actualización se ha realizado ejecutable.
Cuando ejecuto el enganche desde la línea de comandos funciona bien, pero parece que no funciona cuando realizo un check in en el repositorio.

Estoy de acuerdo con los pasos 1 y 2, pero entonces utilizaría this script, como en this question.

Compruebe si funciona con un git push desde su repositorio local a su repositorio desnudo.

#!/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 [email protected]{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 [email protected]{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 
+0

Parece que podría funcionar. Entonces, si tengo el repositorio vacío y actualizo mi gancho post-actualización, ¿puedo usarlo para copiar el código fuente a otro directorio? Supongo que necesitaría un repositorio git similar a lo que tengo en mi máquina local que solo hace un clon del repositorio desnudo. – TripWired

+0

Sí a la primera, y sí (en el caso más simple) a la segunda. Puedo pensar en formas más complicadas de hacerlo que evitarían la duplicación, si el enorme tamaño del repositorio fuera un problema, pero dudo que estés en ese caso. – Cascabel

+0

Bueno, entonces lo que hice fue crear el repositorio desnudo para el check in, luego creé otro repositorio que era estándar, básicamente tengo ~/project.git y ~/project. He clonado project.git en project y en project.git/hooks/post-update pongo: (cd ../../project)(env -i git checkout.) (Env -i git pull) parens solo para separar las líneas aquí También me aseguré de que la actualización posterior fuera ejecutable. Cuando ejecuto el enganche desde la línea de comandos funciona bien, pero parece que no funciona cuando hago un check in en el repositorio. ¿Algunas ideas? – TripWired

0

Si está en linux, puede configurar un trabajo cron para copiar los archivos, o si está en Windows, puede crear una tarea programada con un pequeño script bat o vbs para copiar el archivo en el servidor remoto . Si necesita ayuda para usar Git, aquí está el manual del usuario. Si eso no es lo que estás buscando, podemos trabajar en algo que funcione mejor o si necesitas ayuda con los guiones, házmelo saber.

+0

Entonces, ¿no almacena git los archivos reales en el servidor remoto? Creé un repositorio localmente, envié todos los archivos y luego los envié al servidor remoto, solo parece contener un archivo de paquete grande, sin código fuente real. El servidor es linux (sombrero rojo). Gracias por la info. – TripWired

+0

No puedo estar seguro de lo que pediste exactamente. Una de las ventajas de Git es que no necesita un enfoque centralizado, pero puede hacerlo si lo desea. – Alos

5

Con respecto a su comentario en la publicación de Alos: el control remoto es lo que se denomina un repositorio simple: contiene todo el repositorio, excepto una copia de los contenidos que se ha extraído. La idea es que para los repositorios centrales de los que simplemente empuja y extrae, no es necesario tener los archivos.

Dicho esto, hay muchos enfoques para hacer lo que estás tratando de hacer.

  • Se puede crear otro clon no desnuda a distancia, y lo utilizan para tirar del Pelado y hacer la prueba. Esto es probablemente lo más fácil.

  • Usted puede comprobar directamente archivos (utilizando git read-tree y git checkout-index) desde el repositorio desnudo (un ejemplo viene a la mente, git.git de install-doc-quick.sh).

  • Incluso podría utilizar un control remoto sin formato, pero tenga en cuenta que presionar en un repositorio no estricto es peligroso ya que el árbol de trabajo no se actualiza. Dependiendo de su versión de git, hay varias medidas de seguridad que deberá anular, y tendrá que corregir el árbol de trabajo después de presionar (git reset --hard probablemente).

No importa cuál es el enfoque que toma, asumiendo que usted quiere desencadenar sus pruebas después de cada empuje, se puede utilizar el post-receive or post-update hook para hacerlo. (Puede hacer que compruebe el tiempo transcurrido desde la última prueba si desea evitar las pruebas repetidas de una ráfaga de impulsos)

+0

Sin ofender. Cheers – Alos

+0

Falló por completo su respuesta en el momento en que estaba publicando la mía. +1 para enumerar todas las posibilidades. – VonC

+0

Ya tenías mi +1 para el enlace a la pregunta anterior. – Cascabel

Cuestiones relacionadas