Есть ли в Git «безопасный режим» для предотвращения переписывания истории?

11

Если вы немного знакомы с Git (и DVCS в целом) и начинаете изучать изменения в переписывании истории, вы в безопасности, если репозиторий только локальный, но у вас могут возникнуть проблемы, если вы работаете с удаленными устройствами и попытаетесь толкать такие изменения.

Особенность, которую я ожидаю, - это возможность включить «безопасный режим», который в принципе не позволит мне делать то, что я не должен делать ... И что я имею в виду под этим? Я имею в виду изменения переписывания истории для вещей, уже выдвинутых к происхождению. Я не могу определить это точно, но это будет включать такие случаи, как:

  • commit --amend когда ГОЛОВА уже нажата
  • rebase нелокального филиала
  • reset ветви, которая была раздвинута

Это примеры ситуаций, которые, вероятно, приведут к следующему pushпровалу (потому что это не будет перемотка вперед, IIRC). Я сделал это случайно и мне пришлось заново создать ветку на пульте. И мне все же повезло сделать это достаточно быстро, чтобы никто не вытащил историю, которую я переписал.

Я считаю, что можно идентифицировать изменения такого типа и, по требованию, помешать их внесению пользователем. Есть ли вариант для этого?

Если нет, как вы думаете, стоит ли пытаться его создать? Вы бы попытались точно определить, как определить такое «опасное изменение»?

Кос
источник
В рабочей среде, в которой совершение плохих изменений влияет на других программистов, вы, вероятно, неохотно выполняете эти действия, если не уверены, что это то, что должно работать. Даже в этом случае вы должны убедиться, что после этого никаких проблем не будет. Представьте себе, что несколько лет назад я был в команде из многих программистов, у которых не было бы никаких сомнений в том, что я делаю исходный код, который не компилируется ! Я хотел застрелить его через 3 месяца.
Нил
Представляется разумным, что вы можете обнаружить это в хуке на удаленном компьютере и затем отклонить изменения.
Эндрю Финнелл,
Я не понимаю ваш вопрос. Режим по умолчанию безопасен. Это не позволит вам нажать, если вы не укажете --force.
Шимон Тот
Я тоже хотел бы увидеть что-то подобное. По сути, я хотел бы обеспечить тех, кто изучает git, более безопасной версией, возможно, просто обернув командную строку и раскрывая только основы: коммит, тянуть, толкать, простые вещи. Заставьте их использовать все возможности этой страницы: git-scm.com/book/en/Git-Tools-Rewriting-History Git уже немного сложнее освоить, чем другие инструменты для локального и удаленного репо, о которых нужно думать. - опасаться, что вы могли бы сделать перебаз, вместо отката, страшно.
Крис Москини

Ответы:

5

Это выглядит очень близко, если не тот же вопрос, что и Стратегия предотвращения или перехвата Git History Rewrite

Подводя итог, вы можете включить

git config --system receive.denyNonFastforwards true

и

git config --system receive.denyDeletes true

Или напишите сообщение получения, чтобы отклонить все, что вы считаете переписать.

Эндрю Т Финнелл
источник
1
Я считаю denyNonFastforwards, что по умолчанию (?), А denyDeletesнет. Эти два полезны, но я представляю себе решение на стороне клиента, которое помешало бы мне сделать, то есть сделать, commit --amendесли я не смогу нажать его (потому что HEAD уже был нажат).
Кос,
Другими словами: в дополнение к механизмам, которые позволяют поддерживать согласованность удаленного управления, я хотел бы иметь что-то, что позволяет сохранять клон «согласованным» и с удаленным.
Кос,
@ Kos Вы также можете создавать локальные хуки
Andrew T Finnell
Есть ли способ , чтобы установить denyNonFastfowardsдля trueтолько на мастер - отрасли? Я бы хотел, чтобы мои ветки тем можно было перебазировать и принудительно подталкивать.
nnyby
2

Нет, потому что это часть философии git, чтобы дать вам полную силу и позволить вам управлять этой силой так, как вы хотите.

Если вы не придерживаетесь этой философии, то, возможно, стоит перейти на Mercurial, поскольку они позволяют переписывать историю, но ограниченным или, чтобы быть ясным, неохотным способом, который заставляет вас чувствовать, что это не очень хорошая идея.

Klaim
источник
2
Я делаю ошибки. Механизм, который требует от меня явного подтверждения всякий раз, когда я делаю что-то опасное, - это то, что кажется подходящим для «управления моей властью так, как я хочу». :-) (Также Git уже делает это в некоторых случаях.)
Кос
2

AFAIK, способ, которым git решает эти проблемы, заключается в том, что всякий раз, когда вы запрашиваете такое действие, оно выполняет его локально, но информирует вас о том, что то, что вы делаете, может иметь нежелательные последствия. В этот момент вы еще ничего не выдвинули, поэтому вы можете просмотреть свой локальный репозиторий и, возможно, отменить опасные изменения, прежде чем нажать. Вы должны обратить внимание на то, что говорит вам git, и вам лучше быть осторожным, когда вы исправляете такие ошибки.

tdammers
источник