Ответ 1
Если вы можете запустить:
git config --system receive.denyNonFastforwards true
на сервере, который должен позаботиться о том, чтобы переписать случай истории, нажав на указанный сервер.
Однако это относится ко всем репо, а не к определенному файлу или группе файлов.
receive.denyNonFastForwards
Если вы перезагрузите фиксацию, которую вы уже нажали, а затем попробуйте нажать еще раз или попробуйте нажать фиксацию на удаленную ветку, которая не содержит фиксацию, на которую в данный момент указывает удаленная ветка, вам будет отказано. Это, как правило, хорошая политика; но в случае переустановки вы можете определить, что знаете, что делаете, и можете принудительно обновить удаленную ветвь с помощью значка
-f
для вашей команды push.Другой способ, которым вы можете это сделать, - это использовать крючки приема на стороне сервера, которые я немного покрою. Этот подход позволяет вам выполнять более сложные действия, такие как отказ от быстрого доступа к определенному подмножеству пользователей.
Как ebneter (кто знает важность согласованного репозитория - см. ответ о SVN на Git миграции [вопрос удален, только 10K + пользователей]):
Вы также можете добавить
receive.denyDeletes true
, потому что в противном случае кто-то может просто удалить ветку, а затем перетащить ее переписанную как новую ветку, эффективно переписывая историю.
git config
:
Одним из обходных решений политики denyNonFastForwards является удаление пользователем ветки, а затем ее повторное копирование с новой ссылкой. В новых версиях Git (начиная с версии 1.6.1) вы можете установить
receive.denyDeletes
в значение true:
$ git config --system receive.denyDeletes true
Это отрицает удаление ветки и тега через push через панель - никто не может этого сделать. Чтобы удалить удаленные ветки, необходимо удалить файлы с сервера вручную. Есть также более интересные способы сделать это для каждого пользователя через ACL, как вы узнаете в конце этой главы.