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.
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 PATH
entonces 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
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
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
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.
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) &
el
post-update
los ganchos se pueden activar para este caso, ¿verdad?– Agnibha
30 de enero de 2019 a las 8:21