Как отклонить принудительное обновление GIT на стороне клиента при выполнении git fetch или git pull?

Можно запретить принудительные отправки на стороне сервера, установив receive.denyNonFastForwards или добавив git hook (или другим способом для специальных серверов GIT, таких как Gerrit или Github). Я хотел бы отказаться от принудительного обновления на стороне клиента (см. также здесь) , при выполнении git fetch или git pull или git pull --rebase. Если у меня нет доступа к серверу GIT, чтобы отклонить принудительные нажатия (или если я не доверяю серверу, потому что у других тоже есть доступ), я могу захотеть, чтобы GIT остановился с ошибкой перед изменением каких-либо ссылок, когда принудительное нажатие было Выполнено. Это может помочь заметить, что злоумышленники меняют пульт, или если я просто хочу знать, меняет ли кто-то мои коммиты (да, если я действительно хочу, чтобы кто-то другой не совершал коммитов с использованием моего имени, мне нужно подписывать свои коммиты, используя мой ключ).

Кажется, невозможно запустить код после fetch or pull с помощью хуков. Я анализирую вывод git fetch и выдаю ошибку, если было напечатано «принудительное обновление». Но на самом деле было бы лучше обнаружить это до изменения ссылок.

Есть лучший способ сделать это?


person lumbric    schedule 04.03.2019    source источник


Ответы (2)


Отредактируйте строку remote.fetch gfrom git config, чтобы удалить из нее «+», тогда выборка без быстрой перемотки не удастся. Это не защищает, хотя от удаления ветки

person max630    schedule 05.03.2019

решение max630 подходит, но давайте просто отметим, что когда вы хотите только проверить, что были извлечены / извлечены, вы можете без какого-либо взлома конфигурации перейти к пробному запуску:

git fetch --dry-run

и вы увидите, что было бы, ничего не изменяя в ваших ветках удаленного отслеживания.

Нет аналогичного трюка для вытягивания, но поскольку вытягивание — это выборка + слияние, заранее выполните пробную выборку, и вы будете знать, что было бы вытянуто.


Предел этого метода, как a-git-fetch-or-gi/55006381?noredirect=1#comment96768482_55006381">kan справедливо отметил в комментариях ниже, является его неатомарностью: удаленное состояние может измениться между вашими fetch --dry-run и реальными секундами позже. В любом случае, знать, что он существует, не вредно.

person RomainValeri    schedule 05.03.2019
comment
Просто имейте в виду, что это не атомарно: то есть, если вы сделаете --dry-run, посмотрите, все ли в порядке, а затем, если вы сделаете pull, вы можете переопределить, если кто-то еще тем временем принудительно нажал. - person kan; 05.03.2019
comment
@kan Отличный момент. Это не делает этот вариант бесполезным, но в данном конкретном случае я думаю, что вы правы, подчеркивая это, поскольку главной заботой OP, похоже, является безопасность. - person RomainValeri; 05.03.2019