push --force-with-lease по умолчанию
Я только что узнал о git push --force-with-lease. Это довольно круто. Но, конечно, я не использую силу так часто, и поэтому я беспокоюсь, что могу забыть об этой замечательной функции в следующий раз, когда она мне понадобится.
есть ли способ настроить git так git push -f автоматически использовать --force-with-lease Если я намеренно не переопределить его с --no-force-with-lease?
(Я не могу себе представить, когда-либо желая использовать силу без аренды!)
3 ответов:
насколько мне известно, нет конфигурации доступны, чтобы сказать Git, чтобы всегда использовать
force-with-leaseвместоforce. Это кажется хорошим примером для запроса функции; если у вас нет проблем с погружением в базу кода git, вы можете реализовать ее самостоятельно и отправить на рассмотрение.EDIT в нынешнем виде это по-прежнему верно в феврале 2018 года.
пока единственный вариант я вижу, как это часто бывает, чтобы создать
alias, которое обслуживает этот цель.создать псевдоним
для создания псевдонима можно было бы использовать
git config --global alias.<alias-name> <command>в нашем случае я бы предложил что-то подобное.git config --global alias.pushf "push --force-with-lease"это создаст запись в вашем глобальном
.gitconfigфайл (который вы обычно можете найти в вашем домашний каталог). После этого вы можете просто использоватьgit pushfдо force-with-lease.пачкать руки
если вы хотите реализовать эту функцию самостоятельно, но не уверены, с чего начать, вы должны сначала взглянуть на документация каталог в репозитории git. Здесь вы можете найти рекомендации по кодированию и на сайте как патчи.
вы можете найти все эти ссылки, и больше на официальная страница сообщества.
мое решение состояло в том, чтобы создать скрипт-оболочку и использовать псевдоним, чтобы я всегда использовал его вместо реального
git.всякий раз, когда я пытаюсь
git push -f, Я вижу следующее:⚡ git push -f hey idiot, use this instead so you don't cause race conditions in the repo: git push --force-with-leaseнекоторые преимущества этого скрипта:
- он учит меня привычно использовать
--force-with-lease, так что я не придираюсь, когда я получаю это неправильно- если по какой-то причине нам действительно нужно форсировать толчок,
git push --forceбудет работать.How to реализуйте его:
- создайте пользовательский скрипт, который будет проходить через любые параметры в git, за исключением
-f- псевдоним этого скрипта, поэтому мы используем его вместо
gitэти инструкции предполагают Linux или Mac, работающие под управлением bash. Я не пробовал это с zsh или Windows, но я предполагаю, что это тоже будет работать.
~/.bash_profile:alias git=~/.git_wrapper.sh
~./git_wrapper.sh:#!/bin/bash for arg in "$@"; do if [ "$arg" = "push" ]; then ispush=1 elif [ "$ispush" = 1 -a "$arg" = '-f' ]; then echo "hey idiot, use this instead so you don't cause race conflicts in the repo: git push --force-with-lease" exit 1 fi done git "$@"С этими изменениями, перезагрузите терминал и
gitтеперь должен получить наглость, когда вы пытаетесь заставить толчок.
я беспокоюсь, что могу забыть об этой замечательной функции в следующий раз, когда она мне понадобится.
Git 2.13 (Q2 2017) объясняет, почему нет никакой "защиты" от этой опции push забывается, потому что даже если вы не забудьте об этом в
git pushуровень, он все еще может быть проигнорирован.посмотреть commit f17d642 (19 Apr 2017) by Ævar Arnfjörð Bjarmason (
avar).
(сливаются Junio C Hamano--gitster-- на совершить 46bdfa3, 26 апр 2017)
push: документ и тест--force-with-leaseС несколькими пультамидокумент и тест для случаев, когда есть два пульта ДУ, указывающие на тот же URL-адрес и фоновая выборка и последующая
git push --force-with-leaseне следует колотить не обновленные ссылки, которые мы не получили.некоторые редакторы, такие как VSC от Microsoft, имеют функцию автоматическая выборка в фон, это обходит защиту, предлагаемую
--force-with-lease&--force-with-lease=<refname>, как указано в документации, добавляемой здесь.так документация
git pushтеперь включает в себя:общее примечание по безопасности: поставка этой опции без ожидаемого значение, т. е. как
--force-with-leaseили--force-with-lease=<refname>взаимодействует очень плохо со всем, что неявно работаетgit fetchon пульт дистанционного управления, который нужно нажать в фон, например,git fetch originв репозитории по расписанию.защита, которую он предлагает над
--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обновился в фоновом режиме.
Comments