¿Gancho de ejecución local después de un empujón de git? (post-empuje)

5 minutos de lectura

avatar de usuario de escocés
escocés

he mirado la página de manual de githooks pero a menos que me esté perdiendo algo, no veo una opción para ganchos git locales posteriores a la inserción. Me gustaría tener uno que actualice los documentos de API en mi servidor web (para el cual ya tengo un script) después de enviar la rama maestra al repositorio de GitHub. Por supuesto, podría escribir mi propio script que combine el impulso de git y la ejecución de documentos de API, pero eso se siente un poco poco elegante.

  • el post-update los ganchos se pueden activar para este caso, ¿verdad?

    – Agnibha

    30 de enero de 2019 a las 8:21

Otra solución a este problema es tener una envoltura para git push que ejecuta .git/hooks/pre-push y .git/hooks/post-push guiones antes y después de la git push llamar. Un posible contenedor podría verse así:

#!/bin/sh

GIT_DIR_="$(git rev-parse --git-dir)"
BRANCH="$(git rev-parse --symbolic --abbrev-ref $(git symbolic-ref HEAD))"

PRE_PUSH="$GIT_DIR_/hooks/pre-push"
POST_PUSH="$GIT_DIR_/hooks/post-push"

test -x "$PRE_PUSH" &&
    exec "$PRE_PUSH" "$BRANCH" "$@"

git push "$@"

test $? -eq 0 && test -x "$POST_PUSH" &&
    exec "$POST_PUSH" "$BRANCH" "$@"

Guardado como git-push-wh en algún lugar de tu PATHentonces se puede llamar como git push-wh si quieres empujar con ganchos.

  • Esto es brillante… Uso controles remotos separados: uno donde alojo mi código, un repositorio simple en mi servidor de producción, así que agregué este código para mi ~/.funciones.sh y use ** push origin ** ** push production ** automáticamente inicia el sitio web (ya que está definido en push-post) en mi navegador una vez que se completa el push. ¡Gracias!

    – Saifur Rahman Mohsin

    24/09/2015 a las 22:55

  • El código actual no funciona en los árboles de trabajo de git, para arreglarlo, simplemente cambie 3 líneas: ` GIT_DIR_=”$(git rev-parse –git-path hooks)” PRE_PUSH=”${GIT_DIR_}/pre-push” POST_PUSH= “${GIT_DIR_}/descarga posterior” `

    – KaszpiR

    12 de junio de 2019 a las 16:21

avatar de usuario de ndbroadbent
ndbroadbent

Recientemente me encontré con el mismo problema. Quería un gancho para que un impulso de mi submódulo git confirmara la nueva referencia del submódulo en el ‘superproyecto’.

Como mencionó Chris, la mejor manera es simplemente usar un alias de git, como este:

$ git config alias.xpush '!git push $1 $2 && update-server.sh'
# (remember the backslash before the ! if your shell requires it)

Esto agrega lo siguiente a su archivo .git/config:

[alias]
  xpush = !git push $1 $2 && update-server.sh

Y ahora, si escribes:

$ git xpush

sus cambios serán enviados y luego se ejecutará update-server.sh.

  • Umm, ¿y si estás en una sucursal? y tu haces eso xpush? ¿No debería ser algo así como !git push $1 $2 && update-server.sh para que pueda especificar la rama de origen?

    – Jilbelmonte

    11 de noviembre de 2011 a las 20:53


  • Tenga en cuenta que no es posible anular un comando existente con un alias de git, consulte stackoverflow.com/questions/3538774/…

    – brillo

    8 oct 2018 a las 19:14


Avatar de usuario de Chris Johnsen
chris johnsen

Este tipo de enlace no es compatible con Git. cae fuera de la razones válidas para un gancho Git
según lo dado por el mantenedor de Git.

El comentario introductorio en el mensaje vinculado anterior habla casi directamente de su caso:

No me gustan particularmente los ganchos que actúan después de que una operación se inicia localmente y actúan únicamente en los datos locales. Quizás esto se deba a que todavía considero que las herramientas de git son bloques de construcción adecuados para secuencias de comandos de nivel superior más que otras personas.

PD Una sugerencia de “empuje único”

  • Hay demasiadas advertencias para una explicación completa, pero si puede resolverlo todo, debería poder lidiar con los detalles.

Un extra pushurl a un repositorio local con un almacén de objetos “alternativos” podría brindarle una forma de bajo costo operativo para ejecutar localmente un gancho de inserción. Pero realmente, el esfuerzo es mucho más que git push upstream && update-web-server (tal vez en un alias de shell, alias de git o script).

  • La misma información se puede encontrar en: permalink.gmane.org/gmane.comp.version-control.git/71069

    – Jakub Narębski

    25 de noviembre de 2009 a las 21:24

  • Tenga en cuenta que desde 1.8.2 Git agregó un empuje previo gancho. Revisa mi respuesta para encontrar más información.

    – Adrián Deccico

    27 de noviembre de 2013 a las 4:47

Desde Git 1.8.2, se invoca un nuevo enlace antes de la operación de inserción: empuje previo Si el script devuelve un valor distinto de 0, se cancelará la operación de inserción.

Mención en las notas de la versión: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt#L167

Muestra: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks–pre-push.sample

avatar de usuario de pschmitt
pschmitt

Estoy usando una función para esto:

current_branch() {
    local ref=$(git symbolic-ref HEAD 2> /dev/null) || return
    echo ${ref#refs/heads/}
}

gp() {
    local post_push="$(git rev-parse --git-dir)/hooks/post-push"
    git push "$@" && {
        [[ -x "$post_push" ]] && "$post_push" "$(current_branch)" "$@"
    }
}
compdef _git gp=git-push

La parte compdef es para ZSH.

Avatar de usuario de Claudio
Claudio

De hecho, es posible implementar un gancho post-push usando el reference-transaction gancho. Después de que se realiza un empuje, git actualizará localmente la rama de seguimiento remoto, activando una transacción de referencia en refs/remotes/REMOTE/BRANCH.

Aquí hay un ejemplo de un gancho que usa esta técnica:

#!/bin/bash
set -eu

while read oldvalue newvalue refname
do
    if [ $1 = committed -a $refname = refs/remotes/origin/main ]
    then
        exec .git/hooks/post-push
    fi
done

Este script debe tener el bit ejecutable y estar colocado en .git/hooks/reference-transaction. El anzuelo corre después de empujar la rama principal hasta el origen. Ponga su secuencia de comandos de gancho real en .git/hooks/post-push.

Solo crea un pre-push gancho con un sueño en la parte superior. Asegúrese de que la suspensión sea lo suficientemente larga para que las confirmaciones se carguen en el servidor ascendente en función de la velocidad de su conexión de red. Lo ideal es agregar un & para ejecutar su script en segundo plano:

(sleep 30 && .git/hooks/post-push) &

¿Ha sido útil esta solución?