J'ai peur d'oublier cette fonctionnalité astucieuse la prochaine fois que j'en aurai besoin.
Git 2.13 (Q2 2017) explique pourquoi il n'y a pas de "protection" contre l'oubli de cette option push, car même si vous ne l' oubliez pas au git pushniveau, elle risque d'être ignorée.
Voir commit f17d642 (19 avril 2017) par Ævar Arnfjörð Bjarmason ( avar) .
(Fusionné par Junio C Hamano - gitster- in commit 46bdfa3 , 26 avril 2017)
push: document et test --force-with-leaseavec plusieurs télécommandes
Document et test pour les cas où il y a deux télécommandes pointant vers la même URL, et une récupération en arrière-plan et les suivantes git push --force-with-leasene devraient pas écraser les références non mises à jour que nous n'avons pas récupérées.
Certains éditeurs comme le VSC de Microsoft ont une fonction de récupération automatique en arrière-plan, ce qui contourne les protections offertes par --force-with-lease&--force-with-lease=<refname> , comme indiqué dans la documentation ajoutée ici.
Donc, la documentation pour l'git push instant comprend:
note générale sur la sécurité: fournir cette option sans valeur attendue, c'est à dire as --force-with-leaseou --force-with-lease=<refname>
interagit très mal avec tout ce qui tourne implicitement git fetchsur la télécommande pour être poussé en arrière-plan, par exemple git fetch origin
sur votre référentiel dans un cronjob.
La protection qu'il offre --forcegarantit que les modifications ultérieures sur lesquelles votre travail n'était pas basé ne sont pas écrasées, mais cela est trivialement vaincu si un processus d'arrière-plan met à jour les références en arrière-plan. Nous n'avons rien d'autre que les informations de suivi à distance à utiliser comme heuristique pour les références que vous êtes censé avoir vues et que vous êtes prêt à écraser.
Si votre éditeur ou un autre système s'exécute git fetchen arrière-plan pour vous, un moyen d'atténuer ce problème consiste simplement à configurer une autre télécommande:
git remote add origin-push $(git config remote.origin.url)
git fetch origin-push
Maintenant, lorsque le processus d'arrière-plan s'exécute, git fetch originles références origin-pushne seront pas mises à jour, et donc les commandes telles que:
git push --force-with-lease origin-push
Échouera sauf si vous exécutez manuellement git fetch origin-push.
Cette méthode est bien sûr entièrement vaincue par quelque chose qui s'exécute git fetch
--all, dans ce cas, vous devrez soit la désactiver, soit faire quelque chose de plus fastidieux comme:
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
C'est-à-dire créer une basebalise pour les versions du code en amont que vous avez vues et que vous souhaitez écraser, puis réécrire l'historique, et enfin forcer les modifications à savoir mastersi la version distante est toujours à base, indépendamment de ce que votre local remotes/origin/mastera été mis à jour dans le Contexte.
rmàrm -ivotre .bashrc; vous oublierez et supprimerez un jour un fichier important sur un serveur. Aller avec votre propre alias n'a pas ce problème :)