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?
Respuesta
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
enproject
y enproject.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
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
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
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
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.
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
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
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
ygit 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)
- 1. ¿Cómo lidia Git con los archivos binarios?
- 2. TFS muestra los cambios pendientes con el estado "fusionar". Si los controlo, ¿cambiarán los archivos?
- 3. comando para compilar archivos c con archivos .a
- 4. ¿Cómo controlo el DOM para ver los cambios?
- 5. Cómo archivos "split" con Git
- 6. ¿Cómo ignoro los archivos con la GUI de Git?
- 7. Cómo modificar git add para manejar los archivos eliminados?
- 8. ¿Cómo controlo el tamaño del papel en PDF con ImageMagick?
- 9. Compilar con NDK da error para los archivos de cabecera incluidos con éxito
- 10. ¿Cómo compilar los archivos Fortran 77 en Linux?
- 11. fichero Make: compilar todos los archivos .cpp a .o archivos
- 12. Git ignora los archivos eliminados
- 13. Cómo generar archivos de código fuente y compilar con Gradle
- 14. Git SVN con archivos binarios
- 15. ¿Cómo compilar diferentes archivos c con diferentes CFLAGS usando Makefile?
- 16. Cómo compilar para 32 bits con Eclipse
- 17. Código :: Bloques: cómo compilar varios archivos fuente
- 18. Cómo compilar PDFBox para .Net
- 19. Compilar git para Linux de 32 bits en hosting compartido
- 20. Git + Rails: ¿Cómo restaurar los archivos eliminados con "git rm -r"?
- 21. Por qué los archivos actualizados comprometidos con SVN no serán retirados inmediatamente por Hudson para compilar
- 22. ¿Cómo compilar JavaScriptCore para dispositivos con iOS?
- 23. Obtener toda la historia de los archivos con git-p4
- 24. git: Lista de los nuevos archivos sólo
- 25. Ignorar todos los archivos con el mismo nombre en git
- 26. ¿Qué sucede con los comentarios después de compilar los archivos java en Android?
- 27. asociar un vacío de Git comprometerse con los archivos de
- 28. ¿Cómo comodín incluyen archivos JAR al compilar?
- 29. Estrategia de combinación de Git para ignorar los archivos eliminados
- 30. Usar Hudson para compilar un commit de git específico
¿Estás usando linux, mac o windows? – Alos
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
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