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 push
niveau, 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-lease
avec 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-lease
ne 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-lease
ou --force-with-lease=<refname>
interagit très mal avec tout ce qui tourne implicitement git fetch
sur 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 --force
garantit 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 fetch
en 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 origin
les références origin-push
ne 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 base
balise 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 master
si la version distante est toujours à base
, indépendamment de ce que votre local remotes/origin/master
a été mis à jour dans le Contexte.
rm
àrm -i
votre .bashrc; vous oublierez et supprimerez un jour un fichier important sur un serveur. Aller avec votre propre alias n'a pas ce problème :)