Mercurial : крюк для ограничения тяги только к одной ветви

#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