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.