Estrategia para prevenir o atrapar la historia de git reescribir

Aunque me encanta la function de reescritura de la historia de git, ¿cómo se puede garantizar que la historia no se reescriba?

No nos importa lo que hace un progtwigdor en su propia máquina, pero debemos asegurarnos de que no se envíe una versión al server que cambie el historial.

es decir, debemos garantizar que una versión particular del pasado realmente fue esa versión. Esto includeía evitar que alguien pase y eliminar permanentemente un file del historial, o alterar permanentemente un file a lo largo de todo el historial.

Si puedes correr:

git config --system receive.denyNonFastforwards true 

en el server, eso debería encargarse de reescribir el caso del historial que se envía a dicho server.
Sin embargo, eso es para todo el repository, no para un file específico o grupo de files.

git config :

receive.denyNonFastForwards

Si rebase confirma que ya ha presionado y luego intenta volver a presionar, o intenta enviar una confirmación a una sucursal remota que no contiene la confirmación que señala actualmente la sucursal remota, se le denegará. Esta es generalmente una buena política; pero en el caso de la rebase, puedes determinar que sabes lo que estás haciendo y puedes forzar la actualización de la twig remota con un indicador -f a tu command push.

La otra forma de hacerlo es a través de los ganchos de recepción del lado del server, que cubriré en un momento. Ese enfoque le permite hacer cosas más complejas, como negar el acceso no rápido a un determinado subset de usuarios.


Como ebneter (que conoce la importancia de un repository coherente, consulte la respuesta sobre migraciones de SVN a Git [pregunta ahora eliminada, solo 10K + usuarios]) comentarios:

También es posible que desee agregar receive.denyDeletes true porque, de lo contrario, alguien puede simplemente eliminar la twig y luego presionar su reescrito como una nueva twig, reescribiendo el historial de manera efectiva.

git config :

Una de las soluciones para la política denyNonFastForwards es que el usuario elimine la twig y luego la vuelva a hacer upload con la nueva reference. En las versiones más nuevas de Git (comenzando con la versión 1.6.1), puede configurar receive.denyDeletes como verdadero:

$ git config --system receive.denyDeletes true

Esto niega la supresión de la twig y la label en lugar de un impulso en todos los ámbitos, ningún usuario puede hacerlo. Para eliminar sucursales remotas, debe eliminar los files ref del server manualmente. También hay forms más interesantes de hacerlo por usuario a través de ACL, como aprenderá al final de este capítulo.

Si no está utilizando un git lo suficientemente nuevo para receive.denyNonFastForwards , puede aplicar la política a través de los ganchos {pre,post}-receive (entre otros) en el server, lo que permite un poco más de granularidad para twigs específicas, etc. .

El proyecto GNOME utiliza algunos buenos ejemplos (incluido uno que prohíbe reescribir el historial) para administrar todos los repositorys allí:

https://git.gnome.org/browse/sysadmin-bin/tree/git

Me gustaría ver en particular en pre-receive-check-policy .

Si no puede / no quiere deshabilitar por completo la reescritura del historial de Git pero desea recibir notifications sobre cada cambio de esta naturaleza y recuperar incluso años después, hay extensiones para serveres Git empresariales como Gerrit que detectarán reescrituras de historial y borrados de sucursales , los respaldará con una reference especial para que puedan restaurarse si es necesario y no se recortarán con la recolección de basura. Los administradores de Gerrit aún pueden eliminar confirmaciones seleccionadas si es necesario por razones legales.