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 буду работать.

Как это реализовать:

  1. создайте собственный скрипт, который будет передавать любые параметры в git, кроме -f
  2. псевдоним этого сценария, поэтому мы используем его вместо 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,

Другие вопросы по тегам