В 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
) по дороге в.
Отмечу, что если вы можете придумать рабочий процесс, который избегает пересадки и сохраняет хеши, вам лучше. Отказ от именованных веток полностью облегчает эту задачу - анонимные ветки, возможно, с закладками работают так же или лучше.