Я боюсь, что забуду об этой замечательной функции в следующий раз, когда она мне понадобится.
Git 2.13 (второй квартал 2017 г.) объясняет, почему нет «защиты» от того, чтобы этот параметр push был забыт, потому что даже если вы не забудете его на git pushуровне, его все равно можно будет проигнорировать.
См. Коммит f17d642 (19 апреля 2017 г.), сделанный var Arnfjör Bjarmason ( avar) .
(Объединено Junio C Hamano - gitster- в коммите 46bdfa3 , 26 апреля 2017 г.)
push: документ и тест --force-with-lease с несколькими пультами
Документируйте и тестируйте случаи, когда два пульта дистанционного управления указывают на один и тот же URL-адрес, а фоновая выборка и последующие git push --force-with-leaseне должны затирать необновленные ссылки, которые мы не получили.
Некоторые редакторы, такие как Microsoft VSC, имеют функцию автоматической загрузки в фоновом режиме, это позволяет обойти защиту, предлагаемую --force-with-lease&--force-with-lease=<refname> , как указано в добавляемой здесь документации.
Итак, документация наgit push данный момент включает:
Общее замечание по безопасности: предоставление этой опции без ожидаемого значения, т.е. как --force-with-leaseили --force-with-lease=<refname>
очень плохо взаимодействует с чем-либо, что неявно запускается git fetchна удаленном компьютере, чтобы быть отправленным в фоновом режиме, например, git fetch origin
в ваш репозиторий в cronjob.
Защита, которую он предлагает, --forceгарантирует, что последующие изменения, на которых ваша работа не была основана, не будут засорены, но это тривиально, если какой-то фоновый процесс обновляет ссылки в фоновом режиме. У нас нет ничего, кроме информации об удаленном трекинге, которая будет использоваться в качестве эвристики для рефсов, которых вы ожидали увидеть и которые готовы сработать.
Если ваш редактор или какая-либо другая система работает git fetchв фоновом режиме, для вас способ смягчить это просто настроить другой пульт:
git remote add origin-push $(git config remote.origin.url)
git fetch origin-push
Теперь, когда фоновый процесс запускается, git fetch originссылки на origin-pushне будут обновляться, и, таким образом, такие команды, как:
git push --force-with-lease origin-push
Сбой, если вы не запустите вручную git fetch origin-push.
Этот метод, конечно, полностью побежден чем-то, что работает git fetch
--all, в этом случае вам нужно будет либо отключить его, либо сделать что-то более утомительное, например:
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
Т.е. создайте baseтег для версий вышестоящего кода, которые вы видели и готовы перезаписать, затем переписать историю и, наконец, принудительно принудительно изменить изменения, masterесли удаленная версия все еще работает base, независимо от того, какая локальная версия remotes/origin/masterбыла обновлена в задний план.
rmчтобыrm -iв вашем .bashrc; однажды вы забудете и удалите важный файл на сервере.