¿Git tiene un "modo seguro" para evitar la reescritura del historial?

11

Cuando esté un poco actualizado con Git (y DVCS en general), y comience a explorar los cambios de reescritura del historial, estará seguro si el repositorio es solo local, pero podría tener problemas si trabaja con controles remotos e intenta empujar tales cambios.

Una característica que esperaría es la capacidad de habilitar un "modo seguro" que básicamente me impediría hacer lo que no debería hacer ... ¿Y qué quiero decir con eso? Me refiero a cambios en la reescritura de la historia para cosas que ya se han llevado a un origen. No puedo definirlo con precisión, pero esto incluiría casos como:

  • commit --amend cuando HEAD ya ha sido empujado
  • rebase de una sucursal no local
  • reset de una rama que ha sido empujada

Estos son ejemplos de situaciones que probablemente harán que el próximo pushfracaso (porque no sería un avance rápido, IIRC). Hice algo de eso por accidente y tuve que volver a crear la rama en el control remoto. Y todavía tuve la suerte de hacer esto lo suficientemente rápido como para que nadie sacara la historia que he reescrito.

Creo que es posible identificar este tipo de cambios y, a pedido, evitar que el usuario los haga. ¿Hay tal vez una opción para eso?

Si no lo hay, ¿crees que vale la pena intentar crearlo? ¿Tratarías de definir con precisión cómo identificar tal "cambio peligroso"?

Kos
fuente
En un entorno de trabajo en el que cometer cambios incorrectos afecta a otros programadores, probablemente debería ser más reacio a realizar estas acciones a menos que esté seguro de que es algo que debería funcionar. Incluso entonces, debe verificar que no persistan problemas después. ¡Imagínese que hace unos años, estaba en un equipo de muchos programadores en el que uno no tendría reparos en la fuente que no compilaba ! Quería matarlo a tiros después de 3 meses de eso.
Neil
Parece razonable que pueda detectar esto en un gancho en la máquina remota y luego rechazar los cambios.
Andrew T Finnell el
No entiendo tu pregunta. El modo predeterminado es seguro. No le permitirá empujar, a menos que especifique --force.
Šimon Tóth
Me gustaría ver algo como esto también. Básicamente, me gustaría proporcionar a aquellos que aprenden git una versión más segura, probablemente simplemente ajustando la línea de comando y exponiendo solo los conceptos básicos: commit, pull, push, cosas simples. Oblígalos a usar git completo para cualquier cosa en esta página: git-scm.com/book/en/Git-Tools-Rewriting-History Git ya es un poco más difícil de aprender que otras herramientas para tener en cuenta un repositorio local y remoto - Preocuparte de que puedas cambiar la base en lugar de deshacer es aterrador
Chris Moschini

Respuestas:

5

Esto se ve muy cerca, si no es la misma pregunta que Estrategia para prevenir o atrapar la reescritura del historial de Git

Para resumir, puede habilitar

git config --system receive.denyNonFastforwards true

y

git config --system receive.denyDeletes true

O escriba un mensaje de recepción para rechazar cualquier cosa que determine que es una reescritura.

Andrew T Finnell
fuente
1
Creo que denyNonFastforwardses el valor predeterminado (?), Mientras denyDeletesque no lo es. Estos dos son útiles, pero estoy imaginando una solución del lado del cliente que me impediría, por ejemplo, hacer una acción commit --amendsi no pudiera presionarla (porque HEAD ya fue presionada).
Kos
En otras palabras: además de los mecanismos que permiten mantener un control remoto constante, me gustaría algo que también permita mantener un clon "consistente" con un control remoto.
Kos
@Kos También puedes crear ganchos locales
Andrew T Finnell
¿Hay una manera de establecer denyNonFastfowardsque truesólo en la rama principal? Me gustaría que mis ramas temáticas puedan ser rebajadas y forzadas.
nnyby
2

No, porque es parte de la filosofía de git darle todo el poder y permitirle administrar ese poder de la manera que desee.

Si no se adhiere a esta filosofía, quizás valga la pena cambiar a Mercurial, ya que permiten reescribir el historial, pero de una manera limitada o, para ser clara, reacia, eso le hace sentir que no es una buena idea.

Klaim
fuente
2
Yo cometo errores. Un mecanismo que requiere que confirme explícitamente cada vez que estoy haciendo algo peligroso es algo que parece encajar en "administrar mi poder de la manera que quiero". :-) (También Git ya lo hace en ocasiones.)
Kos
2

AFAIK, la forma en que git resuelve estos problemas es que siempre que solicite dicha acción, la realizará localmente, pero le informará que lo que está haciendo puede tener consecuencias indeseables. En ese momento, aún no ha empujado nada, por lo que está en condiciones de revisar su repositorio local y posiblemente deshacer el cambio peligroso antes de presionar. Sin embargo, debes prestar atención a lo que te dice git, y es mejor que tengas cuidado cuando repares tales errores.

tdammers
fuente