В hg, как я могу отбросить название ветки при перебазировании и / или пересадке из другого репо?

По сути, я хочу попробовать перенести ревизии hg из ветви экспериментального репо в клон mainline. Но я хочу отбросить имя ветки, чтобы я мог сразу перейти к основному репо на стороне сервера. Вероятно, лучше привести простой пример:

hg init hg_mainline
pushd hg_mainline 
touch foo
hg add foo
hg commit -m 'foo'
popd
hg clone hg_mainline hg_experimental
pushd hg_experimental
hg branch bar_branch
touch bar
hg add bar
hg commit -m 'bar'
popd
pushd hg_mainline
hg pull ../hg_experimental
hg log

Как вы можете видеть, основная линия теперь включает в себя оборот с "branch: bar_branch." Я не хочу, чтобы у этой ревизии была ветвь (т.е. она должна быть по умолчанию).

Это нормально, если для этого потребуется переписать историю с помощью rebase, трансплантата или другого инструмента. Я попробовал оба из них, но не мог заставить это работать. Хэш последней редакции может в конечном итоге различаться между двумя репозиториями.

Поэтому я хочу, чтобы верхняя версия hg_mainline выглядела так:

changeset:   1:xxxxxxxxxxxx
tag:         tip
user:        ...
date:        ...
summary:     ...

без названной ветви.

Опять же, все в порядке, если хеш не сохранен из hg_experimental.

В настоящее время я использую hg 1.6.2+55-18e1e7520b67 из Ubuntu PPA.

РЕДАКТИРОВАТЬ:

Я также использовал 1.3.1. Я проверил ниже на обоих, и результаты здесь одинаковы.

Я получил это работает с трансплантацией, но только с grep -v ляп.

hg transplant -s ../hg_experimental 1 --filter "grep -v '^branch:'"

С:

hg transplant -s ../hg_experimental 1

hg export не работал ни с, ни с соответствующим grep.

Изменения патча выглядит так:

# HG changeset patch
# User Matthew Flaschen <EMAIL>
# Date 1282942390 14400
# Branch bar_branch
# Node ID b8e36efea72642f0a0194301489d5c48f619a921
# Parent  85d9b9773d4ec09676dfcc4af89c142c46279444
bar

Я экспортировал из экспериментального с:

hg export 1 -o '/tmp/%b_%H_%R'

и попытался импортировать в mainline с помощью:

hg import /tmp/hg_experimental_b8e36efea72642f0a0194301489d5c48f619a921_1

Это терпит неудачу с:

abort: no diffs found

РЕДАКТИРОВАТЬ 2:

Как отмечалось, метод экспорта не удался только потому, что файлы были пустыми. Работает правильно с --git или с непустыми файлами.

2 ответа

Решение

Самое простое решение - это использование hg export из экспериментального репо, и hg import в основной репо. По умолчанию, hg import не будет применять какую-либо информацию о ветке в патче. Недостатком является то, что они будут отображаться как разные наборы изменений в двух репозиториях - hg incoming в экспериментальном репо будут показаны только что экспортированные / импортированные вами изменения, поэтому после этого вам может быть лучше удалить и заново создать экспериментальное репо, если вы планируете проводить какие-либо эксперименты.

РЕДАКТИРОВАТЬ: Из hg_mainline репозиторий:

hg export -r 1 -R ../hg_experimental | hg import -

EDIT2: от hg help diffs:

Стандартный формат Mercurial для отображения изменений между двумя версиями файла совместим с унифицированным форматом GNU diff, который может использоваться патчем GNU и многими другими стандартными инструментами.

Хотя этого стандартного формата достаточно часто, он не кодирует следующую информацию: (фрагмент)

  • создание или удаление пустых файлов

Тестовые файлы пусты в вашем тестовом скрипте, поэтому вам нужно либо ввести в них что-то, либо использовать --git возможность hg export,

Расширение пересадки уже отбрасывает название ветви:

cd hg_mainline
hg transplant -s ../hg_experimental 1

должен сделать это для вас. Если вы обнаружите, что это не так, вы всегда можете использовать --filter изменить наборы изменений (возможно, просто используя grep -v) по дороге в.

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

Другие вопросы по тегам