remove - git tag best practices
Gancho de ejecución local después de un empujón git? (5)
Miré la página de githooks, pero a menos que me falta algo, no veo una opción para los ganchos de git locales, posteriores a la inserción. Me gustaría tener uno que actualice los documentos de API en mi servidor web (para los cuales ya tengo un script) después de pasar la rama principal al repositorio de GitHub. Por supuesto, podría simplemente escribir mi propio guión que combine el git push y el api docs run, pero eso se siente algo poco elegante.
Desde Git 1.8.2 hay un nuevo enlace invocado antes de la operación de inserción: pre-push. Si el script retorna a otro valor que no sea 0, la operación de inserción se cancelará.
Mención en las notas de la versión: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt#L167
Este tipo de gancho no es compatible con Git. Cae fuera de las razones válidas para un gancho Git dado por el mantenedor de Git.
La observación introductoria en el mensaje vinculado anteriormente se dirige casi directamente a su caso:
No me gustan particularmente los anzuelos que actúan después de que una operación se inicia localmente y actúa únicamente sobre la base de datos locales. Esto es tal vez porque todavía considero que las herramientas git son esenciales para guiones de alto nivel más que otras personas.
PS Una sugerencia de "solo empuje"
- Hay demasiadas advertencias para una explicación completa, pero si puede resolverlo todo, debería ser capaz de manejar los detalles.
Un pushurl
adicional a un repositorio local con una tienda de objetos "alternativos" podría darle una forma de gastos indirectos bajos para ejecutar localmente un gancho de empuje. Pero realmente, el esfuerzo es mucho más que git push upstream && update-web-server
(tal vez en un alias de shell, git alias o script).
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.
Otra solución a este problema es tener un contenedor para git push
que ejecute .git/hooks/pre-push
y .git/hooks/post-push
antes y después de la llamada git push
. 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
, puede llamarse git push-wh
si quieres empujar con ganchos.
Recientemente me encontré con el mismo problema. Quería un gancho para que un empujón de mi submódulo git comprometiera la nueva referencia del submódulo en el ''superproyecto''.
Como Chris mencionó, 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 escribe:
$ git xpush
Se presionarán sus cambios y luego se ejecutará update-server.sh.