Git как предотвратить локальное изменение публичных коммитов
Я уже добавил receive.denyNonFastforwards и receive.denyDeletes на моем сервере git центрального репо. Теперь я хотел бы заблокировать модификацию локальной истории, если фиксация уже была нажата на центральное репо (как и по умолчанию, по умолчанию mercurial), я полагаю, что могу использовать крючок, но я не мог найти никакого примера.
Это странная конфигурация?
Это звучит как основная защита, которую должен активировать любой, кто использует git, и я очень удивлен отсутствием примеров перехватов.
Ответы
Ответ 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
Или напишите сообщение, чтобы отклонить все, что вы определили, это переписать