Push -force-with-lease по умолчанию
Я только что узнал о git push --force-with-lease
. Это довольно здорово. Но, конечно, я не часто использую силу, и поэтому я беспокоюсь, что могу забыть об этой замечательной функции в следующий раз, когда мне это понадобится.
Есть ли способ настроить git, поэтому git push -f
будет автоматически использовать --force-with-lease
, если я намеренно не переопределяю его с помощью --no-force-with-lease
?
(Я не могу себе представить, что когда-либо хотел использовать силу без аренды!)
Ответы
Ответ 1
AFAIK нет конфигурации, позволяющей git всегда использовать force-with-lease
вместо force
. Это, кажется, хороший пример для запроса функции; если у вас нет проблем погрузиться в базу кода git, вы можете реализовать ее самостоятельно и отправить на рассмотрение.
РЕДАКТИРОВАТЬ В нынешнем виде это все еще верно в апреле 2019 года.
До тех пор единственный вариант, который я вижу, - это, как часто бывает, создавать alias
который служит этой цели.
Создать псевдоним
Чтобы создать псевдоним, можно использовать псевдоним git config --global alias.<alias-name> <command>
, в нашем случае я бы предложил нечто подобное.
git config --global alias.pushf "push --force-with-lease"
Это создаст запись в вашем глобальном файле .gitconfig
(который вы обычно можете найти в вашем домашнем каталоге). После этого вы можете просто использовать git pushf
для принудительной аренды.
Пачкайте руки
Если вы хотите реализовать эту функцию самостоятельно, но не знаете, с чего начать, сначала вы должны взглянуть на каталог документации в репозитории git. Здесь вы можете найти рекомендации по кодированию и информацию о том, как отправлять патчи.
Вы можете найти все эти ссылки и многое другое на официальной странице сообщества.
Ответ 2
Моим решением было создать оболочку script и использовать псевдоним, чтобы я всегда использовал его вместо реального 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
Некоторые преимущества этого script:
- он тренирует меня, чтобы привычно использовать
--force-with-lease
, поэтому я не получаю nagged, когда я ошибаюсь
- Если по какой-то причине нам действительно нужно принудительно нажать,
git push --force
будет работать.
Как его реализовать:
- создайте пользовательский script, который пройдет через любые параметры до git, за исключением
-f
- псевдоним script, поэтому мы используем его вместо
git
Эти инструкции предполагают Linux или Mac, работающие под управлением bash. Я не пробовал это с zsh или Windows, но я предполагаю, что он тоже будет работать.
~/.bash_profile
:
alias git=~/.git_wrapper.sh
~./git_wrapper.sh
:
#!/bin/bash
for arg in "[email protected]"; 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 "[email protected]"
С этими изменениями перезагрузите терминал, а git
должен теперь получить неудобство при попытке принудительного нажатия.
Ответ 3
Я волнуюсь, что я могу забыть об этой замечательной функции в следующий раз, когда мне это понадобится.
Git 2.13 (Q2 2017) объясняет, почему нет "защиты" от этой опции push забывается, потому что даже если вы не забудете ее на уровне git push
, ее все равно можно игнорировать.
См. commit f17d642 (19 апреля 2017 г.) Ævar Arnfjörð Bjarmason ( avar
).
(слияние Junio C Hamano - gitster
- в commit 46bdfa3, 26 апреля 2017 г.
push
: документ и тест --force-with-lease
с несколькими пультами
Документ и тест для случаев, когда есть два пульта, указывающих на один и тот же URL-адрес, а также выбор фона и последующий git push --force-with-lease
не должны clobber не обновленные ссылки, которые мы не получили.
Некоторые редакторы, такие как Microsoft VSC, имеют функцию автоматического извлечения в background, это обходит защиту, предлагаемую --force-with-lease
и --force-with-lease=<refname>
, как указано в прилагаемой документации.
Итак, документация для git push
теперь включает в себя:
общее примечание по безопасности: поставка этой опции без ожидаемого значение, то есть как --force-with-lease
или --force-with-lease=<refname>
очень плохо взаимодействует с чем-либо, что неявно запускает git fetch
on пульт, который должен быть сдвинут в фоновом режиме, например. git fetch origin
в вашем хранилище в cronjob.
Защита, которую он предлагает более --force
, гарантирует, что последующие изменения, на которых ваша работа не была основана, не сбиты, но это тривиально побеждено, если какой-либо фоновый процесс обновляет ссылки в фоновом режиме. У нас нет ничего, кроме информации о дистанционном отслеживании, которая будет проводиться как эвристика для ссылок, которые вы ожидали увидеть и готовы к clobber.
Если ваш редактор или какая-либо другая система работает git fetch
в фоном для вас способом смягчения этого является просто настройка другой удаленный:
git remote add origin-push $(git config remote.origin.url)
git fetch origin-push
Теперь, когда фоновый процесс запускает git fetch origin
, ссылки on 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
для версий вышерасположенного кода, который вы используете увиденные и желающие перезаписать, затем переписать историю и, наконец, принудительно изменить push на master
, если удаленная версия все еще находится в base
, независимо от того, что ваш локальный remotes/origin/master
был обновлен в фоновом режиме.
Ответ 4
Для людей, использующих OMYZSH, вы можете просто использовать ggfl
.