Хорошо, похоже, что настоящий ответ таков: «Mercurial не может делать то, что вы хотите» (то есть иметь синхронизацию между хранилищем и ветвью, которая является строгим подмножеством этого хранилища), за исключением использования каких-то ужасно неудобных система, как очереди исправлений. Возможно, Git, но так как его порт Windows еще не готов к производственному использованию, я не стал вдаваться в подробности.
Однако оказалось возможным реорганизовать проект таким образом, чтобы можно было разделить открытые и закрытые части на отдельные репозитории с незначительной потерей истории. (На самом деле, он был разделен на три части, в то время как мы занимались этим - публичный раздел, публичный, но машинный раздел, который мы поместили в подкаталог local/
(так что его можно было клонировать к большей части машин с почти идентичные спецификации без необходимости поддерживать и объединять дополнительные ветви на несколько странных), а также закрытый раздел, который мы помещаем в подкаталог private/
.) Уловка оказалась не в том, чтобы попытаться поместить очищенного ведомого в мастер, а в разделение частные / локальные части из мастера и поместите их как (псевдо) суб-репозитории в подчиненном репозитории на главном компьютере.
Этап 1 состоял в том, чтобы переместить файлы в каталоги private/
и local/
, удалить их из главного репозитория и добавить их в .hgignore по мере необходимости, если замена символических ссылок могла бы создать проблемы на других машинах. К счастью, около 95% материалов, которые нам пришлось переместить таким образом, не зависели от местоположения, а остальное мы могли обработать вручную. Эти два каталога стали собственными репозиториями.
Этап 2, который мы в основном уже сделали: hg convert
с использованием --filemap
для создания общедоступной версии хранилища, в которой были удалены все следы личных данных. (На самом деле это потребовало небольшой настройки файловой карты: вам нужно исключить не только все текущие имена файлов личных данных, но также и любые имена файлов, которые они могли иметь в прошлом. Способность Mercurial отслеживать перемещения / переименования файлов кажется не совсем надежной. .)
В этот момент каталог .hg/
на главном сервере был перемещен в резервное хранилище, и из очищенного общедоступного репозитория было сделано новое извлечение. Затем мы запустили наши тесты, чтобы убедиться, что все работало, и начали клонировать новый базовый репозиторий и выбрали local
репозитории для подчиненных машин, и проверили их, и все вроде бы нормально, хотя нам пришлось настроить несколько мест, где символические ссылки перестали работать (в основном на блоках Windows, хотя в одном месте, что довольно любопытно, на стороне Linux, и мне придется разобраться, почему не использовалась символическая ссылка, когда у меня будет свободное время, хотя мы решили проблема, когда было обнаружено, что этот конкретный файл может и действительно должен быть автоматически восстановлен).