pre git commit gancho para asegurar la cabeza está al corriente de recompra maestro

StackOverflow https://stackoverflow.com/questions/3994252

  •  10-10-2019
  •  | 
  •  

Pregunta

Me voy a mudar a mi equipo más de un viejo depósito de CVS a utilizar git. Tenía la esperanza de añadir en un gancho precommit para asegurar una confirmación antes de que se hace a nivel local (y empujado a) cada persona tiene una puesta al día de recompra.

Por ejemplo, en el CVS todo el mundo sería hacer un 'cvs up' antes de hacer cambios, y luego cometer. Quiero forzarlo para que la gente no puede confirmar los cambios a menos que hayan hecho un git pull origin master primera (no vamos a utilizar ramas adicionales)

¿Hay una manera fácil de hacer esto? aplausos para cualquier ayuda:)

¿Fue útil?

Solución

Comprobar y ver si los agentes de mantenimiento de git ls-remote origin HEAD (punta remoto) y git rev-parse HEAD (consejo local) son iguales?

Tenga en cuenta que al hacer esto, vaya a desechar una LOT de la flexibilidad de Git - piensa si el de realmente lo que quiere hacer. Parte de la fuerza de git pull es que incluso si has cometido cosas que divergen de la copia maestra, cuando se tire de la copia maestra sus cambios se pueden combinar en (y en la mayoría de los casos, el proceso es completamente automático).

Si su objetivo es tener una historia lineal comprometerse (que tiene sus propias ventajas y desventajas), sugeriría echar un vistazo a la orden rebase en lugar de obligar a los desarrolladores a no cometer detrás del origen / maestra.

Editar

En realidad, si estás haciendo muy git pull (en lugar de rebase), que no será capaz de comparar las cabezas, porque tirón estaría haciendo confirmaciones de combinación. En su lugar, lo que se necesita para comparar git ls-remote origin HEAD a git merge-base origin/HEAD HEAD.

Algunos otros comentarios

  • ¿Por qué utiliza Git, pero luego no usar ramas adicionales en absoluto? Eso es algo así como la compra de un coche, pero nunca utilizando el motor (y en su lugar simplemente empujándolo en todas partes). Las ramas son barato en Git, rápido de instalar, y casi sin esfuerzo a la fusión. Usted se está haciendo un flaco favor si usted no hace uso de ellos.

  • ¿Por qué te importa casi todo el mundo estar al día antes de hacer cambios? Esto no es CVS, la resolución de conflictos no es terrible - Git se auto-determinación del 95% de los conflictos para usted sin que tenga que hacer nada, así que si usted git pull antes o después de realizar los cambios realmente no importa - se Sólo tienen que sacar antes de empujar y se le multa.

  • Relacionado con el punto anterior: ya no empuja avance rápido son rechazados por defecto, usted no necesita realmente un gancho. Sólo decirle a los desarrolladores "si su empuje es rechazada como no avance rápido, hacen un git pull, a continuación, intente empujar de nuevo" y todo saldrá bien.

Otros consejos

Esto destruye la naturaleza 'distribuido' de Git. Esto hace que cada commit algo global. Los cvs "comprometen" es análogo al git "push" que es lo que se comunica con el extremo remoto.

Si realmente quiere aprovechar el modelo distribuido, debe fomentar y hacer que su equipo a comprender el punto de confirmaciones locales en lugar de hacer que el sistema alcanzó el repositorio central sobre cada confirmación (que se sierra centralizada).

Si está siguiendo la rama remota:

git fetch
git log HEAD..origin
# or:
git diff ...origin

Como otras respuestas se alude, obligando a ese tipo de verificación no siempre es una buena solución para cualquier repo a distancia, pero puede ser interesante como una advertencia.

No hay que olvidar que una git push será rechazado por defecto si no se produce un cambio fastforward .
Por lo que el git pull será la manera de evitar que el mensaje de todos modos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top