#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
. Что-то вроде этого:
- Клонируйте исходное хранилище в новое хранилище
hg up null
чтобы удалить что-либо из рабочего каталога (возможно, быстрее работать с ним таким образом)- Определите все ветки (именованные или анонимные) и наборы изменений, которые вы хотите удалить. Чтобы быть точным, вам нужен идентификатор набора изменений каждого коммита и его потомков, которые должны быть удалены.
hg strip -r 12345678890
для каждого из этих коммитов. Это удаляет коммит и всех его потомков (потенциально включая слияния).
При необходимости вы можете выполнить эту процедуру дважды, но во второй раз удалите ортогональный набор наборов изменений (те, которые относятся к default-other, но не к default).
Тем не менее, есть несколько причин, по которым вы все равно можете захотеть использовать hg convert
:
-
В репозитории есть файлы, которые не имеют отношения к делу. Например, если в ветке по умолчанию были какие-то старые вещи, которые не имеют ничего общего с default-other . Вы могли бы использовать для удаления истории таких файлов.
convert
-
Вы хотите, чтобы default и default-other выглядели так, как будто они всегда были одной и той же веткой. Вы можете использовать
convert
для переименования одного или обоих из них. (branchmap
) -
Вы хотите убедиться, что новые репозитории не могут быть отправлены / извлечены с оригиналом, что может испортить все ваши хорошо продуманные планы. При «преобразовании» всего репозитория IIRC все идентификаторы набора изменений будут обновлены, и репозиторий не будет выглядеть как родственник оригинала.
Мой совет — работать поэтапно:
- Клонируйте оригинал в clone1
- Используйте
strip
, чтобы сделать как можно больше - Создайте clone2 из clone1
- Выполнить
convert
задачу #1 - Создайте clone3 из clone2
- Выполнить
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 был отключен. Обновленный вопрос, чтобы сделать это требование более понятным.