Что я хочу сделать:
Я хочу запретить любые коммиты слияния , чтобы быть выдвинутыми в центральное хранилище. Единственное исключение состоит в том, что происходит слияние между ветвями, существующими в центральном хранилище. Я хочу применить это в центральном хранилище.
Объяснение, почему я хочу это сделать:
Примечание. Если это объяснение сбивает вас с пути того, что я хочу сделать, игнорируйте это объяснение. Конечно, я рад услышать другие способы решения проблемы, которую я объясняю ниже, но ответ, который меня интересует, заключается в том, что я хочу сделать, как указано выше.
У меня есть центральное хранилище git с веткой, которую отслеживают несколько разработчиков. У каждого разработчика есть удаленный компьютер, настроенный для ветки этого центрального репозитория.
Мы придерживаемся политики синхронного принятия для этого проекта, поэтому каждый разработчик должен всегда перебазировать свою последнюю работу поверх удаленной ветки HEAD, прежде чем нажать. Я хотел бы применить эту политику, запретив любые коммиты слияния, которые когда-либо будут отправлены в центральный репозиторий. Единственное исключение, если слияние происходит между ветвями, которые существуют в центральном хранилище.
Чтобы упростить, я не хочу, чтобы локальные ветви отслеживания разработчика когда-либо объединялись с удаленной веткой. Но лучше всегда делать перебаз в удаленной ветке.
Мы частично применили это на компьютере разработчика, установив значение branch.NAME.rebase = true, которое помогает избежать проблем, если разработчик использует git pull, однако нам нужно решение для принудительного применения этого на стороне центрального хранилища.
Самым базовым решением было бы отказаться от коммитов с комментарием: "Слияние ветки 'NAME' из GITURL", однако, что-то более подробное, если проверить, существуют ли все родители коммита в путях ветвления центрального репозитория, Дальше интереснее.
Предложения? Решения?
Edit:
Это то, что я имею до сих пор:
#!/bin/sh
read sha1old sha1new refname
# check if this is merge commit
merge_commit="`git rev-list --parents --merges --no-walk $sha1new 2> /dev/null`"
if test -n "$merge_commit"
then
# this was a merge commit
# $merge_commit contains: sha1new sha1parent_1 ... sha1parent_n
fi
exit 0
Место, которое вызывает беспокойство, определяет, происходит ли происхождение любых двух родителей от одной ветви. Кроме того, поскольку ловушка предварительного получения вызывается перед обновлением каких-либо ссылок, если push содержит фиксации для двух ветвей, существующих на удаленном компьютере, включая объединение между этими двумя ветвями, то я понятия не имею, какое решение будет здесь. .