push --force-with-lease по умолчанию



Я только что узнал о git push --force-with-lease. Это довольно круто. Но, конечно, я не использую силу так часто, и поэтому я беспокоюсь, что могу забыть об этой замечательной функции в следующий раз, когда она мне понадобится.



есть ли способ настроить git так git push -f автоматически использовать --force-with-lease Если я намеренно не переопределить его с --no-force-with-lease?



(Я не могу себе представить, когда-либо желая использовать силу без аренды!)

640   3  
git

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 реализуйте его:

  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 (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 fetch on пульт дистанционного управления, который нужно нажать в фон, например,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

    Ничего не найдено.