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

Git как предотвратить локальное изменение публичных коммитов

Я уже добавил receive.denyNonFastforwards и receive.denyDeletes на моем сервере git центрального репо. Теперь я хотел бы заблокировать модификацию локальной истории, если фиксация уже была нажата на центральное репо (как и по умолчанию, по умолчанию mercurial), я полагаю, что могу использовать крючок, но я не мог найти никакого примера.

Это странная конфигурация?

Это звучит как основная защита, которую должен активировать любой, кто использует git, и я очень удивлен отсутствием примеров перехватов.

4b9b3361

Ответ 1

Вы можете предотвратить локальную модификацию истории, используя Client-Side Hooks, как и с Серверные крюки.

Здесь приведены некоторые примеры кода крючка на стороне клиента. В конце этой страницы находится предварительная rebase script, которая делает что-то близкое к тому, что вы ищете.

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

Поскольку hooks arent, переданный с клоном проекта, вы должны распространять эти сценарии каким-либо другим способом, а затем ваши пользователи копируют их в каталог .git/hooks и делают их исполняемыми. Вы можете распространять эти крючки в проекте или в отдельном проекте, но Git не будет автоматически устанавливать их.

Ответ 2

Mercurial предлагает какой-то способ справиться с изменчивым чагенсетом (изменениями, которые вы можете переупорядочить/переписать). Например, с плагин ChangeSet Evolution.

Возможность более ограничена на стороне сервера с помощью git (вы можете отменить push --force с двумя конфигурациями, указанными в вопросе)

Вы не можете легко навязать крючок на стороне клиента, так как он должен быть активирован и может быть обойден с помощью git commit --no-verify.

Но перед git 1.8.5 был клик для предварительной перезагрузки клиента.

После git 1.8.5 вы можете сделать как клиент a git push -force-with-lease

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

Это обеспечивает некоторую свободу на стороне клиента и более безопасный принудительный толчок на стороне сервера.

Ответ 3

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

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

git config --system receive.denyNonFastforwards true

и

git config --system receive.denyDeletes true

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