¿Cómo hacer que Git me advierta sobre el cambio de commit push?

tl; dr: cometer algo, empujar eso, modificar ese compromiso e intentar presionar de nuevo sin usar --force falla. ¿Cómo configurar Git para que diga, cuando bash cambiar 'commits publicados'?


Estoy usando Git desde hace bastante time y todavía es una de las mejores cosas que me ha sucedido (software): es totalmente compatible con la forma en que hago las cosas de la caja. Ayer mismo hice algo estúpido: cometí algunas cosas, lo empujé a mi control remoto, dejé el trabajo por algunos minutos y cuando volví, noté que había cambiado uno de los files después de haberlo agregado, por lo que el compromiso fue sin completar. Como de costumbre, usé git commit --amend para solucionar este pequeño problema.

Trabajé durante varias horas y decidí que ya era hora de otro git push . Para mi sorpresa, git se negó y leyendo el post, retrocediendo miles de líneas, vi lo que hacía y sabía lo que estaba pasando. El control remoto básicamente no es más que una copy de security privada fuera del sitio y nadie más lo usa para empujar o tirar. Así que no tuve problemas con nadie que reescribiera el historial usando git push --force . Dado que no me gustaría que esto suceda en un entorno multiusuario (ya sea para limpiar mi historial o force-push), pensé en cómo prevenir esto en el futuro: Git podría emitir una advertencia claramente visible, tal vez incluso requiriendo que escriba alguna cosa. Lo notaria y probablemente decida no enmendarlo.

Entonces, la pregunta es: ¿cómo puedo configurar Git para que me advierta acerca de la modificación de confirmaciones que ya se han enviado? O más en general: ¿cómo puedo configurar Git para advertirme sobre el cambio de historial publicado?

Editar # 1 (~ 6 h más tarde) : Desafortunadamente, no me siento lo suficientemente seguro para tratar de implementar esto por mi count, pero tal vez ayuda a alguien a ayudarme 🙂 Pensé que ya que --amend afecta --amend a la última confirmación, bastaría con tener un enlace precompromiso que verifique el hash de la confirmación que bash modificar y la confirmación actual / más reciente presionada al control remoto. Por ejemplo, actualmente obtengo b45025a... como el último compromiso de master en mi máquina local, lo apreté y cat .git/refs/remotes/<remote-name>/master da también b45025a... Entonces, ¿sería útil verificar si la twig remota correspondiente está en la misma confirmación que la que estoy tratando de enmendar en este momento?


Antes de escribir esto, le pregunté a Google y también revisé brevemente las preguntas que encontré aquí, pero parece que nada encaja (selección):

  • Cómo deshacer "git commit –amend" en lugar de "git commit"
  • git rebase interactivo ya comprometido commits
  • Estrategia para prevenir o atrapar la historia de git reescribir

Deberías poder hacer esto con un git-hook post-rewrite . Esto obtiene una list de confirmaciones reescritas en stdin que puedes verificar contra tus controles remotos. Lamentablemente, esto solo le dará un error ya que no hay pre-rewrite gancho de pre-rewrite .

editar: Alguien me desafió a desempolvar mi bash y probar este, así que aquí hay una advertencia de trabajo:

 #!/bin/sh # # Place this in the file .git/hooks/post-rewrite and make executable # # An attempt to write a git-hook to warn of rewritten commits on remotes while read -r commit junk; do if [ ! -z "$(git branch -r --contains $commit)" ]; then echo "############################### WARNING ###############################" echo "$commit has been rebased but exists on these remote branches" echo $(git branch -r --contains $commit) echo "You may want to rethink this rewrite" fi done