¿Cómo puedo permitir que las confirmaciones de git merge sean maestras pero evitar las confirmaciones que no son de fusión?

4 minutos de lectura

avatar de usuario
ricardo neish

Tengo un gancho de compromiso previo de Git que me impide comprometerme con el maestro a menos que se anule, para alentar el desarrollo en la rama.

Sin embargo, me gustaría permitir automáticamente fusionar confirmaciones para dominar. ¿Hay alguna manera de identificar una confirmación de combinación de mi secuencia de comandos de enlace previa a la confirmación? El guión se ve así:

#!/bin/bash

BRANCH=`git branch --color=never| grep '^*'|cut -c3-`

if [ "${BRANCH}D" == "masterD" -a "${GIT_COMMIT_TO_MASTER}D" != "trueD" ]
then
  echo "Commit directly to master is discouraged."
  echo "If you want to do this, please set GIT_COMMIT_TO_MASTER=true and then commit."
  exit 1
fi

RESUELTO: Para cualquiera que busque cortar y pegar, la versión de trabajo de este script de gancho es:

#!/bin/bash

BRANCH=$(git rev-parse --abbrev-ref HEAD)

if [ "${BRANCH}" == "master" -a "${GIT_COMMIT_TO_MASTER}" != "true" ]
then
  if [ -e "${GIT_DIR}/MERGE_MODE" ]
  then
    echo "Merge to master is allowed."
    exit 0
  else
    echo "Commit directly to master is discouraged."
    echo "If you want to do this, please set GIT_COMMIT_TO_MASTER=true and then commit."
    exit 1
  fi
fi

  • Sugerencia: una forma más sólida de obtener la rama actual es branch=$(git rev-parse --abbrev-ref HEAD).

    – jub0bs

    24 de marzo de 2015 a las 9:54


  • Gracias, intentaré eso.

    -Richard Neish

    24 de marzo de 2015 a las 9:55

  • @Jubobs: generalmente es mejor usar git symbolic-ref HEAD. uno puede agregar -q si es necesario, sería en este caso y luego querría salir de 0, por lo que en este especial caso, utilizando git rev-parse bien podría ser superior de todos modos: para una cabeza separada solo obtendrá HEAD atrás, que no coincidirá master.

    – torek

    24 de marzo de 2015 a las 10:09

  • No está relacionado con la pregunta, pero su D los suficientes son completamente redundantes. Solo los necesitaría si no usara comillas, y reducen la legibilidad, así que simplemente suéltelos.

    – Adam Spires

    24 de marzo de 2015 a las 10:10

  • También vale la pena señalar que el indicador ‘–no-verify’ omitirá el gancho de confirmación previa. Sugiero eliminar la sección ‘GIT_COMMIT_TO_MASTER’ a favor de anular caso por caso, ya que es fácil olvidarse de establecer ‘GIT_COMMIT_TO_MASTER’ nuevamente en falso después de anular.

    – esto se ve divertido

    9 de mayo de 2017 a las 15:16

Puse algunos comentarios, pero el importante aquí es que en un pre-enganche de compromiso, el compromiso que está a punto de probar aún no existe, por lo que no puede contar sus padres.

Esto es lo que obtienes:

  • si estás usando git commit --amend a enmendar una confirmación de combinación, el gancho de confirmación previa se ejecuta como de costumbre, pero realmente no puede detectar que esto está sucediendo. La nueva confirmación será una fusión, pero no se nota.

  • Si está usando el viejo regular git commit para crear una confirmación de no fusión, el archivo MERGE_HEAD no existirá en el directorio git, y se puede decir que esto no va a crear una confirmación de fusión.

  • si estás usando git commit para finalizar una fusión conflictiva, el archivo MERGE_HEAD voluntad existen, y se puede decir que esto va a crear una confirmación de fusión.

  • si estas corriendo git merge y tiene éxito por sí solo, realiza una nueva confirmación sin usar el gancho de confirmación previa, por lo que ni siquiera lo invocan aquí.

Por lo tanto, si está dispuesto a permitir git commit --amend en las fusiones para fallar, puede acercarse a lo que quiere: solo pruebe la existencia de $GIT_DIR/MERGE_HEAD para ver si esto es un git commit eso es terminar una fusión conflictiva. (El uso de $GIT_DIR es un truco para hacer que esto funcione incluso si los comandos se ejecutan fuera del árbol de git. Conjuntos Git $GIT_DIR para que los comandos git in-hook funcionen correctamente).

  • Eso parece prometedor. estoy feliz por git commit --amend para requerir una anulación, por lo que la comprobación de ${GIT_DIR/MERGE_HEAD} es exactamente lo que estoy buscando. Probaré y si no encuentro ningún problema, aceptaré esta respuesta.

    -Richard Neish

    24 de marzo de 2015 a las 10:33

¿Ha sido útil esta solución?