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 pushlivello, 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-leasecon 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-leasenon 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-leaseo--force-with-lease=<refname>
interagisce molto male con tutto ciò che viene implicitamente eseguito git fetchsul 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 fetchin 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 originil processo in background, i riferimenti origin-pushnon 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 basetag 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 masterse la versione remota è ancora disponibile base, indipendentemente da quale remotes/origin/mastersia stato aggiornato il tuo locale nella sfondo.
rmarm -inel vostro .bashrc; un giorno dimenticherai ed eliminerai un file importante su un server. Andare con il tuo alias non ha questo problema :)