Разделить ветку на новое хранилище

#mercurial

#mercurial

Вопрос:

У меня есть репозиторий mercurial, который теперь фактически содержит два репозитория. В какой-то момент в прошлом ветка была отделена от default (назовем ее default-other). Как по умолчанию, так и по умолчанию-other теперь имеют много коммитов, и нет никаких планов когда-либо объединять default-other обратно в default. Некоторые коммиты были перенесены из default в default-other.

Теперь я хочу создать новое хранилище из другой ветки по умолчанию, сохранив при этом полную историю. т.Е. Хранилище, которое содержит

  • все коммиты от default до точки, где была создана ветка default-other
  • все коммиты из default-other
  • все ветви, которые были отделены от default-other
  • нет коммитов от default после default-другое было отключено

Оптимально, я хотел бы использовать разные стратегии для разных ветвей. Некоторые ветви являются ветвями выпуска, которые необходимо сохранить, тогда как другие являются функциональными ветвями, которые я хотел бы включить в новое значение по умолчанию.

Я пытался использовать расширение convert, но не могу понять, как правильно настроить карту ветвей.

Ответ №1:

Я думаю, вы можете сделать почти все, что вы указали, используя hg strip . Что-то вроде этого:

  1. Клонируйте исходное хранилище в новое хранилище
  2. hg up null чтобы удалить что-либо из рабочего каталога (возможно, быстрее работать с ним таким образом)
  3. Определите все ветки (именованные или анонимные) и наборы изменений, которые вы хотите удалить. Чтобы быть точным, вам нужен идентификатор набора изменений каждого коммита и его потомков, которые должны быть удалены.
  4. hg strip -r 12345678890 для каждого из этих коммитов. Это удаляет коммит и всех его потомков (потенциально включая слияния).

При необходимости вы можете выполнить эту процедуру дважды, но во второй раз удалите ортогональный набор наборов изменений (те, которые относятся к default-other, но не к default).

Тем не менее, есть несколько причин, по которым вы все равно можете захотеть использовать hg convert :

  1. В репозитории есть файлы, которые не имеют отношения к делу. Например, если в ветке по умолчанию были какие-то старые вещи, которые не имеют ничего общего с default-other . Вы могли бы использовать для удаления истории таких файлов. convert

  2. Вы хотите, чтобы default и default-other выглядели так, как будто они всегда были одной и той же веткой. Вы можете использовать convert для переименования одного или обоих из них. ( branchmap )

  3. Вы хотите убедиться, что новые репозитории не могут быть отправлены / извлечены с оригиналом, что может испортить все ваши хорошо продуманные планы. При «преобразовании» всего репозитория IIRC все идентификаторы набора изменений будут обновлены, и репозиторий не будет выглядеть как родственник оригинала.


Мой совет — работать поэтапно:

  1. Клонируйте оригинал в clone1
  2. Используйте strip , чтобы сделать как можно больше
  3. Создайте clone2 из clone1
  4. Выполнить convert задачу #1
  5. Создайте clone3 из clone2
  6. Выполнить convert задачу #2

и т.д.

Я рекомендую не объединять много разных convert вещей вместе — запускать их с небольшими приращениями. Может показаться, что это займет больше времени, но так гораздо проще все исправить.

В конечном итоге вы можете удалить все промежуточные клоны, но по опыту я обнаружил, что это самый продуктивный и безопасный способ внести большие структурные изменения.

Ответ №2:

Просто используйте описанный в wiki формат branchmap . В вашем случае это будет просто

 default-other default
...
renamed-child1 default
renamed-child2 default
...
  

Добавление

Поскольку расширение Convert не может остановить преобразование условия «до», только «после» (см. --rev Опцию), вы должны подготовить репозиторий для преобразования перед процессом преобразования (клонировать в новое промежуточное хранилище только подмножество или исходные наборы изменений без default , только default-other и потомков?)

Комментарии:

1. Спасибо, но, используя эту карту ветвей, я буду получать коммиты от default-other и default, но я хочу «отключить» default в точке, где default-other был отключен. Обновленный вопрос, чтобы сделать это требование более понятным.