#mercurial #hook #pull
#mercurial #перехват #тянуть
Вопрос:
Я в тупике, пытаясь убедиться, что репозиторий развертывания обновляет только определенную ветку с центрального сервера Mercurial.
В частности, мне нужно убедиться, что любой, кто вносит изменения в репозиторий развертывания, выполняет эквивалент
hg pull -b deployment <central-repo-url>
вместо
hg pull <central-repo-url>
Я предполагаю, что мне нужно использовать pre-pull
крючок, но я не уверен, как это сделать.
Ответ №1:
Кроме того, та же техника, но более удобный для пользователя способ;
Расширение ACL, в котором вы определяете [acl.deny.branches] и [acl.allow.branches] для вашего рабочего процесса
Комментарии:
1. Ответ Тома был чрезвычайно полезен; но расширение ACL кажется самым простым решением. Спасибо.
2. О, да, я об этом вообще не подумал. Я думаю, что ACL — это то, что вы используете для управления отправками в репозиторий, но, конечно, ничто не мешает использовать его для извлечения. Чистый и настраиваемый.
Ответ №2:
Проще всего было бы определить псевдоним в hgrc этого репозитория, который определяет pull
как pull -b deployment
. Тогда любая попытка потянуть приведет к тому, что вы хотите. Тем не менее, было бы очень легко испортить это таким образом, чтобы сделать любую попытку выполнить бесконечный цикл.
Я бы предложил pretxnchangegroup
перехват. Это позволяет вам просматривать импортируемые наборы изменений и отклонять их, если они вам не нравятся. Я подозреваю, что правило, которое вы хотите применить, заключается в том, что подсказка всегда должна находиться в ветке развертывания (группа изменений может перетаскивать наборы изменений из других ветвей, которые были объединены в развертывание, но подсказка всегда должна исходить из развертывания). Это был бы перехват, подобный:
[hooks]
pretxncommit.deployment = hg log -r tip --template '{branch}n' | grep '^deployment