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

По сути, я хочу попробовать перенести ревизии 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.

EDIT:

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

Я работал с трансплантатом, но только с grep -v кладжем.

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

С:

hg transplant -s ../hg_experimental 1

hg экспорт тоже не работал, с или без соответствующего 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'

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

hg import /tmp/hg_experimental_b8e36efea72642f0a0194301489d5c48f619a921_1

Сбой:

abort: no diffs found

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

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

Ответы [ 2 ]

3 голосов
/ 27 августа 2010

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

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

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

РЕДАКТИРОВАТЬ2: С hg help diffs:

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

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

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

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

2 голосов
/ 27 августа 2010

Расширение трансплантата уже удаляет название ветви:

cd hg_mainline
hg transplant -s ../hg_experimental 1

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

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

...