Pregunta push --force-with-lease por defecto


Acabo de enterarme git push --force-with-lease. Es bastante impresionante. Pero, por supuesto, no uso la fuerza con tanta frecuencia, y por eso me preocupa que pueda olvidarme de esta función ingeniosa la próxima vez que la necesite.

¿Hay alguna manera de configurar git para git push -f usará automáticamente --force-with-lease a menos que lo anule intencionadamente con --no-force-with-lease?

(¡No me puedo imaginar alguna vez querer usar la fuerza sin arriendo!)


74
2018-05-30 05:09


origen


Respuestas:


AFAIK no hay configuración disponible para decirle a Git que siempre use force-with-lease en lugar de force. Este parece ser un buen ejemplo para una solicitud de función; si no tiene problemas para sumergirse en la base del código git, puede implementarlo usted mismo y enviarlo para su revisión.

EDITAR Tal como está, esto sigue siendo cierto en febrero de 2018.


74
2018-06-01 06:54



Me preocupa que pueda olvidarme de esta característica ingeniosa la próxima vez que la necesite.

Git 2.13 (Q2 2017) explica por qué no se olvida la "protección" contra esta opción de inserción, porque incluso si no haga Olvídalo en el git push nivel, aún puede ser ignorado.

Ver cometer f17d642 (19 de abril de 2017) por Ævar Arnfjörð Bjarmason (avar).
(Fusionado por Junio ​​C Hamano - gitster - en cometer 46bdfa3, 26 de abril de 2017) 

push: documento y prueba --force-with-lease con múltiples controles remotos

Documento y prueba para los casos en que hay dos controles remotos que apuntan a la   misma URL, y una captura de fondo y posterior git push --force-with-lease no debería contener referencias no actualizadas que no hayamos obtenido.

Algunos editores como Microsoft VSC tienen una función para recuperar automáticamente en el   fondo, esto pasa por alto las protecciones ofrecidas por --force-with-lease & --force-with-lease=<refname>, como se indica en la documentación que se agrega aquí.

Entonces el documentación para git push ahora incluye:

Nota general sobre seguridad: el suministro de esta opción sin una esperada   valor, es decir, como --force-with-lease o --force-with-lease=<refname>   interactúa muy mal con cualquier cosa que se ejecute implícitamente git fetch en   el control remoto al que se va a enviar en segundo plano, p. git fetch origin   en tu repositorio en un cronjob.

La protección que ofrece sobre --force es asegurarse de que los cambios posteriores en los que su trabajo no se basó no se destruyan, pero esto es trivialmente vencido si algún proceso en segundo plano actualiza las referencias en segundo plano. No tenemos nada más que la información de seguimiento remoto para pasar como una heurística para los ref que se espera que hayas visto y estés dispuesto a jugar.

Si su editor u otro sistema se está ejecutando git fetch en el   fondo para ti una forma de mitigar esto es simplemente configurar otro   remoto:

git remote add origin-push $(git config remote.origin.url)
git fetch origin-push

Ahora cuando se ejecuta el proceso en segundo plano git fetch origin Las referencias   en origin-push no se actualizará, y por lo tanto comandos como:

git push --force-with-lease origin-push

Fallará a menos que ejecute manualmente git fetch origin-push.
  Este método es completamente derrotado por algo que se ejecuta git fetch --all, en ese caso necesitaría deshabilitarlo o hacer algo   más tedioso como:

git fetch              # update 'master' from remote
git tag base master    # mark our base point
git rebase -i master   # rewrite some commits
git push --force-with-lease=master:base master:master

Es decir. crear un base etiqueta para las versiones del código anterior que has   visto y está dispuesto a sobrescribir, luego reescribir la historia y finalmente forzar cambios de inserción para master si la versión remota todavía está en base, independientemente de lo que su local remotes/origin/master se ha actualizado a en segundo plano.


11
2018-05-01 20:35



Mi solución fue crear un script de contenedor y usar un alias para usarlo siempre en lugar del real git.

Cada vez que trato de git push -f, Veo lo siguiente:

 git push -f
hey idiot, use this instead so you don't cause race conditions in the 
repo: git push --force-with-lease

Algunas de las ventajas de este script son:

  • me entrena para usar habitualmente --force-with-lease, entonces no me molestan cuando me equivoco
  • si, por alguna razón, realmente necesitamos forzar el empuje, git push --force trabajará.

Cómo implementarlo:

  1. crear un script personalizado que pase por cualquier params a git, excepto por -f
  2. alias ese script, así que lo usamos en lugar de git

Estas instrucciones asumen Linux o Mac, ejecutando bash. No he intentado esto con zsh o Windows, pero supongo que también funcionará allí.

~/.bash_profile:

alias git=~/.git_wrapper.sh

~./git_wrapper.sh:

#!/bin/bash
for arg in "$@"; do
    if [ "$arg" = "push" ]; then
        ispush=1
    elif [ "$ispush" = 1 -a "$arg" = '-f' ]; then
        echo "hey idiot, use this instead so you don't cause race conflicts in the repo: git push --force-with-lease"
        exit 1
    fi
done

git "$@"

Con esos cambios, reinicie su terminal y git ahora debería volverse empinado cuando intentes forzar el empuje.


11
2017-11-29 01:20