Hacer que el repositorio de git remoto rechace la combinación de combinaciones en el push
Lo que quiero hacer:
quierorechazar algunaFusionar confirmaciones serempujado al repositorio central. losla única excepción siendo si la combinación es entre las ramas que existen en el repositorio central. Quiero hacer cumplir esto en el repositorio central.
Explicación de por qué quiero hacer esto:
Nota: Si esta explicación te hace perder el rastro de lo que quiero hacer, entonces ignora la explicación. Por supuesto, me complace escuchar otras maneras de resolver el problema que explico a continuación, pero la respuesta que me interesa es a lo que quiero hacer como se indicó anteriormente.
Tengo un repositorio central de git con una rama que varios desarrolladores rastrean. Cada desarrollador tiene un remoto configurado para la rama de ese repositorio central.
Seguimos una política de confirmación sincrónica para este proyecto, por lo que cada desarrollador siempre debe volver a escribir su último trabajo en la parte superior de la rama remota HEAD antes de presionar. Me gustaría hacer cumplir esta política al rechazar que cualquier compromiso de fusión sea enviado al repositorio central. La única excepción es si la combinación es entre las ramas que existen en el repositorio central.
Para simplificar, no quiero que las sucursales locales de seguimiento del desarrollador se fusionen con las sucursales remotas. Pero más bien siempre ser rebasado en la rama remota.
En parte, hemos implementado esto en la máquina del desarrollador al establecer branch.NAME.rebase = true, que ayuda a evitar problemas si el desarrollador usa git pull, sin embargo, necesitamos una solución para imponer esto en el repositorio central.
Una solución muy básica sería rechazar los compromisos con el comentario: "Combinar la rama 'NOMBRE' de GITURL", sin embargo, algo más en la línea de verificación de si todos los padres de un compromiso existen en las rutas de las sucursales del repositorio central sería más interesante.
Sugerencias? Soluciones?
Editar:
Esto es lo que tengo hasta ahora:
#!/bin/sh
read sha1old sha1new refname
# check if this is merge commit
merge_commit="`git rev-list --parents --merges --no-walk $sha1new 2> /dev/null`"
if test -n "$merge_commit"
then
# this was a merge commit
# $merge_commit contains: sha1new sha1parent_1 ... sha1parent_n
fi
exit 0
El lugar en el que se vuelve problemático es determinar si la ascendencia de cualquiera de los dos padres se origina en una sola rama. Además, debido a que se llama al gancho de recepción previa antes de que se actualicen las referencias, si un envío contiene confirmaciones para las dos ramas que existen en el control remoto, incluida una combinación entre esas dos ramas, no tengo idea de cuál sería la solución aquí. .