repositorio - Escribir un gancho git post-receive para tratar con una rama específica
git push tag (7)
Aquí está mi gancho actual en un repositorio desnudo que vive en el servidor de la compañía: git push origin master
Este engancha empuja a Assembla. Lo que necesito es empujar solo una rama (ideal, ideal) cuando alguien empuja cambios a esa rama en nuestro servidor e ignorar los empujes hacia otras ramas. ¿Es posible seleccionar la rama desde un repositorio simple y enviar solo esa rama a Assembla?
El último parámetro que un gancho posterior a la recepción obtiene en stdin es qué ref se modificó, por lo que podemos usar eso para verificar si ese valor era "refs / heads / master". Un poco de rubí similar a lo que uso en un gancho post-recepción:
STDIN.each do |line|
(old_rev, new_rev, ref_name) = line.split
if ref_name =~ /master/
# do your push
end
end
Tenga en cuenta que se obtiene una línea para cada ref que se presionó, por lo que si empujó más que simplemente master, aún así funcionará.
Enfoque simple, en git hook
write
read refname
echo $refname
Simple - más información sobre este excelente sistema de enlace de enlaces
Había escrito un script PHP para mí para hacer esta funcionalidad.
https://github.com/fotuzlab/githubdump-php
Aloje este archivo en su servidor, preferiblemente repo root y defina la url en github webhooks. Cambie ''allcommits'' en la línea 8 con su nombre de sucursal y agregue su código / función en la línea 18.
p.ej
function githubdump($payload_object) {
// Write your code here.
exec(''git push origin master'');
}
La respuesta de @pauljz funciona bien para ciertos git hooks como pre-push
, pero pre-commit
no tiene acceso a esas variables oldrev newrev refname
Así que creé esta versión alternativa que funciona para pre-commit, o really y hook. Este es un gancho de pre-commit
que ejecutará un guión husky
si NO estamos en la rama master
.
#!/bin/bash
# git ''commit'' does not have access to these variables: oldrev newrev refname
# So get the branch name off the head
branchPath=$(git symbolic-ref -q HEAD) # Something like refs/heads/myBranchName
branch=${branchPath##*/} # Get text behind the last / of the branch path
echo "Head: $branchPath";
echo "Current Branch: $branch";
if [ "master" != "$branch" ]; then
# If we''re NOT on the Master branch, then Do something
# Original Pre-push script from husky 0.14.3
command_exists () {
command -v "$1" >/dev/null 2>&1
}
has_hook_script () {
[ -f package.json ] && cat package.json | grep -q "/"$1/"[[:space:]]*:"
}
cd "frontend" # change to your project directory, if .git is a level higher
# Check if precommit script is defined, skip if not
has_hook_script precommit || exit 0
# Node standard installation
export PATH="$PATH:/c/Program Files/nodejs"
# Check that npm exists
command_exists npm || {
echo >&2 "husky > can''t find npm in PATH, skipping precommit script in package.json"
exit 0
}
# Export Git hook params
export GIT_PARAMS="$*"
# Run npm script
echo "husky > npm run -s precommit (node `node -v`)"
echo
npm run -s precommit || {
echo
echo "husky > pre-commit hook failed (add --no-verify to bypass)"
exit 1
}
fi
Espero que ayude a alguien. Puede modificar fácilmente para sus necesidades, cualquier cosa entre las declaraciones if
y fi
.
La respuesta de Stefan no funcionó para mí, pero this hizo:
#!/bin/bash
echo "determining branch"
if ! [ -t 0 ]; then
read -a ref
fi
IFS=''/'' read -ra REF <<< "${ref[2]}"
branch="${REF[2]}"
if [ "master" == "$branch" ]; then
echo ''master was pushed''
fi
if [ "staging" == "$branch" ]; then
echo ''staging was pushed''
fi
echo "done"
Ninguna de las soluciones anteriores funcionó para mí. Después de mucha, mucha depuración, resulta que usar el comando ''leer'' no funciona; en cambio, analizar los argumentos de la línea de comandos de la manera habitual funciona bien.
Aquí está el gancho exacto post-actualización que acabo de probar con éxito ahora en CentOS 6.3.
#!/bin/bash
echo "determining branch"
branch=`echo $1 | cut -d/ -f3`
if [ "master" == "$branch" ]; then
echo "master branch selected"
fi
if [ "staging" == "$branch" ]; then
echo "staging branch selected"
fi
exec git update-server-info
ACTUALIZACIÓN: en una nota aún más extraña, el gancho pre-recepción toma su entrada a través de stdin, por lo tanto, lea con ''leer'' (wow, nunca pensé que diría eso). El gancho post-actualización aún funciona con $ 1 para mí.
Un gancho post-recepción obtiene sus argumentos de stdin, en la forma <oldrev> <newrev> <refname>
. Como estos argumentos provienen de stdin, no de un argumento de línea de comando, debe usar read
lugar de $1 $2 $3
.
El gancho posterior a la recepción puede recibir múltiples ramas a la vez (por ejemplo, si alguien hace un git push --all
), así que también tenemos que ajustar la read
en un ciclo while.
Un fragmento de trabajo se ve más o menos así:
#!/bin/bash
while read oldrev newrev refname
do
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
if [ "master" == "$branch" ]; then
# Do something
fi
done