push --force-with-lease по умолчанию
Я только что узнал о git push --force-with-lease
, Это довольно круто. Но, конечно, я не так часто применяю силу, и поэтому я волнуюсь, что могу забыть об этой изящной функции в следующий раз, когда она мне понадобится.
Есть ли способ настроить GIT так git push -f
будет автоматически использовать --force-with-lease
если я намеренно не переопределить его --no-force-with-lease
?
(Я не могу себе представить, что когда-либо хотел применить силу без аренды!)
3 ответа
AFAIK нет конфигурации, позволяющей git всегда использовать force-with-lease
вместо force
, Это, кажется, хороший пример для запроса функции; если у вас нет проблем погрузиться в базу кода git, вы можете реализовать ее самостоятельно и отправить на рассмотрение.
РЕДАКТИРОВАТЬ В нынешнем виде это все еще верно в феврале 2018 года.
До тех пор единственный вариант, который я вижу, - это, как это часто бывает, alias
которая служит этой цели.
Создать псевдоним
Чтобы создать псевдоним, можно использовать git config --global alias.<alias-name> <command>
В нашем случае я бы предложил что-то похожее на это.
git config --global alias.pushf "push --force-with-lease"
Это создаст запись в вашем глобальном .gitconfig
файл (который вы обычно можете найти в вашем домашнем каталоге). После этого вы можете просто использовать git pushf
принудительно сдать в аренду.
Пачкайте руки
Если вы хотите реализовать эту функцию самостоятельно, но не знаете, с чего начать, сначала вы должны взглянуть на каталог документации в репозитории 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
буду работать.
Как это реализовать:
- создайте собственный скрипт, который будет передавать любые параметры в 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 (2-й квартал 2017 г.) объясняется, почему не существует "защиты" от того, что эта опция нажатия была забыта, потому что даже если вы ее не забудете в git push
уровень, это все еще может быть проигнорировано.
См. Коммит f17d642 (19 апреля 2017 г.) Ævar Arnfjörð Bjarmason ( avar
)
(Объединено Юнио С Хамано - 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
был обновлен в фоновом режиме.
Я хочу напомнить, что не должен использовать -f
, но я не хочу, чтобы меня обманом заставили поверить, что -f
означает --force-with-lease
. Итак, это мое мнение:
git() {
if [[ $@ == 'push -f'* ]]; then
echo Hey stupid, use --force-with-lease instead
else
command git "$@"
fi
}
Добавить в свой .bash_profile
, .bashrc
или .zshrc
.
Вы можете создать функцию bash, которая заменяет git
и использовать --force-with-lease
вместо того --force
# replaces `git push --force` with `git push --force-with-lease`
git() {
if [[ $@ == 'push -f'* || $@ == 'push --force'* ]]; then
command git push --force-with-lease
else
command git "$@"
fi
}
или в одной строке:
git() { if [[ $@ == 'push -f'* || $@ == 'push --force'* ]]; then command git push --force-with-lease; else command git "$@"; fi; }
Просто добавьте его в свой ~/.bashrc
или ~/.zshrc
.
Для людей, использующих OMYZSH, вы можете просто использовать ggfl
,