Подтвердить что ты не робот

Стратегия предотвращения или ловушки git переписать историю

Хотя мне нравится функция перезаписи истории git, как обстоит дело с обеспечением истории, она не переписывается.

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

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

4b9b3361

Ответ 1

Если вы можете запустить:

 git config --system receive.denyNonFastforwards true

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

git config:

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, как вы узнаете в конце этой главы.

Ответ 2

Если вы не используете достаточно новый git для receive.denyNonFastForwards, вы можете применить политику с помощью {pre,post}-receive (среди прочих) перехватов на сервере, что позволяет немного увеличить степень детализации для определенных ветвей и так далее д.

Некоторые хорошие примеры (в том числе запрещающие перезаписи истории) используются проектом GNOME для управления всеми репозиториями:

https://git.gnome.org/browse/sysadmin-bin/tree/git

Я бы посмотрел, в частности, на pre-receive-check-policy.

Ответ 3

Если вы не можете/не хотите полностью отключать переписывание истории Git, но хотите получать уведомления обо всех изменениях этого характера и быть в состоянии восстановить даже годы спустя, есть расширения для корпоративных серверов Git, таких как Gerrit, что будет обнаруживать перезаписи истории и удаления ветвей, будет поддерживать их под специальным ref, чтобы они могли быть восстановлены, если это необходимо, и не будут обрезаны сборкой мусора. Администраторы Gerrit могут по-прежнему удалять выбранные коммиты, если это необходимо по юридическим причинам.