Как мне сообщить (локально) Mercurial, что сервер не публикуется?
Как я могу сказать Mercurial, что удаленный сервер (например, на Bitbucket) не публикуется, когда у меня нет доступа к удаленному .hg/hgrc
файл?
Фон
Последние версии Mercurial имеют концепцию фаз, которые позволяют отслеживать, какие наборы изменений были предоставлены (public
) а какие нет (draft
). Операции изменения репозитория, такие как rebase
разрешены на draft
наборы изменений, но не public
Наборы изменений, как и другие, могут зависеть от последнего.
Выдача наборов изменений на общедоступный сервер изменит их фазу на public
по умолчанию, но если сервер является частным или выделенным для проверки кода (т. е. люди не должны иметь возможность извлекать данные), то отправка на этот "не публикуемый" сервер не должна изменять фазу.
Документированный способ сообщить Mercurial, что сервер не публикуется, - добавить [phases]
раздел к .hg/hgrc
файл на сервере:
[phases]
publishing = false
Мне кажется, что должен быть способ включить строку в один из моих местных hgrc
файлы, в которых говорится, что определенный сервер не публикуется, но я не могу найти какую-либо документацию, которая бы подсказывала, как это сделать. Возможно, это поведение можно настроить с помощью крючка?
Рекомендации
2 ответа
В настоящее время нет способа сделать это, и мы надеемся, что этого никогда не произойдет.
Вот почему:
Если вы позволяете локальному репозиторию переопределять конфигурацию удаленного репозитория, вы просто делаете весь фазовый механизм бесполезным. Смысл фаз состоит в том, чтобы запретить пользователю выполнять действия, которые могут "повредить" поток синхронизации.
В обязанности получателя входит описание того, как будут использоваться полученные наборы изменений. Если вы измените эту логику, позволив отправителю переопределить эти параметры, то как вы можете гарантировать, что два отправителя будут использовать одну и ту же конфигурацию? Если конфигурация отличается, какую следует сохранить? Как пометить наборы изменений на приемнике?
В некоторой степени это было бы так же, как если бы локальный репозиторий мог передавать наборы изменений на удаленный сервер без авторизации, просто переопределяя удаленную конфигурацию локально.
Я знаю, что этому вопросу 10 лет, но только что у меня было именно это требование, очень старый сервер Mercurial, который даже не знает о фазах (все его репозитории всегда публикуются), где я хотел создать репозиторий обзора.
Я нашел ответ в этой старой почтовой ветке :
Идея в том, что у вас есть общедоступный репозиторий (здесь он называется
<public>
), который содержит все публичные коммиты, и вы устанавливаете хуки pull и push, которые изменяют все эти локальные коммиты на draft , которых НЕТ в этом публичном репозитории.
[hooks]
post-push = hg phase --force --draft 'public() and outgoing(<public>)'
post-pull = hg phase --force --draft 'public() and outgoing(<public>)'