Sono preoccupato che potrei dimenticare questa caratteristica elegante la prossima volta che ne avrò bisogno.
Git 2.13 (Q2 2017) spiega perché non vi è alcuna "protezione" da dimenticare questa opzione push, perché anche se non la dimentichi a git push
livello, potrebbe comunque essere ignorata.
Vedi commit f17d642 (19 apr 2017) di Ævar Arnfjörð Bjarmason ( avar
) .
(Unito da Junio C Hamano - gitster
- in commit 46bdfa3 , 26 apr 2017)
push
: documenta e testa --force-with-lease
con più telecomandi
Documenta e verifica i casi in cui ci sono due telecomandi che puntano allo stesso URL e un recupero in background e successivi git push --force-with-lease
non dovrebbero ostruire i riferimenti non aggiornati che non abbiamo recuperato.
Alcuni editor come Microsoft VSC hanno una funzione per il recupero automatico in background, questo ignora le protezioni offerte da --force-with-lease
&--force-with-lease=<refname>
, come indicato nella documentazione che viene aggiunta qui.
Quindi la documentazione pergit push
ora include:
nota generale sulla sicurezza: fornire questa opzione senza un valore atteso, ovvero come --force-with-lease
o--force-with-lease=<refname>
interagisce molto male con tutto ciò che viene implicitamente eseguito git fetch
sul telecomando per essere spinto in background, ad esempio git fetch origin
sul proprio repository in un cronjob.
La protezione che offre --force
che le successive modifiche su cui non è stato basato il tuo lavoro non siano bloccate, ma questo è banalmente sconfitto se alcuni processi in background aggiornano i riferimenti in background. Non abbiamo nulla a parte le informazioni di tracciamento remoto da passare come euristiche per i ref che dovresti aver visto e che sei disposto a bloccare.
Se il tuo editor o qualche altro sistema è in esecuzione git fetch
in background per te, un modo per mitigarlo è semplicemente configurare un altro telecomando:
git remote add origin-push $(git config remote.origin.url)
git fetch origin-push
Ora, quando viene eseguito git fetch origin
il processo in background, i riferimenti origin-push
non verranno aggiornati e quindi comandi come:
git push --force-with-lease origin-push
Fallirà se non si esegue manualmente git fetch origin-push
.
Questo metodo è ovviamente completamente sconfitto da qualcosa che viene eseguito git fetch
--all
, in tal caso dovresti disabilitarlo o fare qualcosa di più noioso come:
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
Vale a dire creare un base
tag per le versioni del codice upstream che hai visto e che sei disposto a sovrascrivere, quindi riscrivere la cronologia e infine forzare le modifiche push master
se la versione remota è ancora disponibile base
, indipendentemente da quale remotes/origin/master
sia stato aggiornato il tuo locale nella sfondo.
rm
arm -i
nel vostro .bashrc; un giorno dimenticherai ed eliminerai un file importante su un server. Andare con il tuo alias non ha questo problema :)