Как с помощью Mercurial я могу «сжать» серию наборов изменений в один перед отправкой?
-
05-07-2019 - |
Вопрос
Допустим, у меня есть локальный и удаленный репозиторий Mercurial.Теперь я начинаю работать над функцией.Я работаю над этим и, когда думаю, что все готово, фиксирую набор изменений.Протестировав еще немного, я обнаружил, что могу еще больше улучшить эту функцию, изменив что-нибудь в коде.Я вношу изменения и фиксирую их.Через 20 минут я обнаружил ошибку в этой новой функции, поэтому исправил ее и зафиксировал и ее.
Теперь у меня есть 3 набора изменений, которые я бы очень хотел отправить в удаленный репозиторий как один набор изменений, например, с сообщением «Реализация функции X».
Как мне это сделать без особых хлопот?Я думаю, что смогу сделать это с помощью патчей, но, похоже, это требует много работы.
Решение
Как насчет Свернуть расширение ?
Другие советы
А гистедит расширение — это именно то, что вы ищете.
hg histedit -o
или
hg histedit --outgoing
отобразит список исходящих наборов изменений.Из списка вы можете
- Сложите 2 или более набора изменений, создав один единственный набор изменений.
- Удалить наборы изменений, удалив их из истории.
- Измените порядок наборов изменений по своему усмотрению.
histedit предложит вам ввести новое сообщение о фиксации свернутых наборов изменений, которое по умолчанию представляет собой два сообщения с разделителем « *** ».
Вы также можете получить аналогичные результаты, используя расширение mq, но это намного сложнее.
Вы также можете использовать расширение свертывания, чтобы просто выполнить свертывание, но оно не обеспечивает такой приятный пользовательский интерфейс и не дает возможности редактировать полученное сообщение о фиксации.Редактирование полученного сообщения о фиксации также позволяет очистить окончательное сообщение, что я всегда использую.
Да, вы можете сделать это с патчами: Давайте предположим, что ваша работа состоит из ревизий от 100 до 110 включительно
<Ол>Создать патч:
% hg export -o mypatch 100: 110 --git
Обновление до 99:
% hg update 99
Примените патч с параметром --no-commit (иначе вы вернете все свои наборы изменений):
% hg import --no-commit mypatch
Передайте все изменения сразу:
% hg commit
Теперь у вас есть две головы (110 и 111), которые должны быть эквивалентны с точки зрения файлов, которые они производят в вашем рабочем каталоге, - возможно, рассмотрите их для здравого смысла перед удалением старых:
% hg strip 100
Хорошо, теперь, когда я все это изложил, это кажется длинным, но, выполнив это несколько раз самому, я не считаю, что это слишком хлопотно ...
Если вы используете TortoiseHg, команда use может просто выбрать две ревизии (используйте CTRL для выбора непоследовательных), щелкните правой кнопкой мыши и выберите " Сжать историю " .
После этого вы получите новый список изменений в новом заголовке, начиная с первого выбранного ранее изменения, он будет содержать все списки изменений потомков между выбранными вами.
Вы можете просто удалить старые списки изменений, если они вам больше не нужны: используйте для этого расширения MQ . Опять же, в TortoiseHg: щелкните правой кнопкой мыши первый список изменений, который необходимо удалить со всеми его потомками, " Изменить историю - > Газа & Quot;. Сильный> р>
Мой предпочтительный метод использования mq для этого свертывания - использование TortoiseHg как описано здесь . Однако это легко сделать из командной строки, например так:
hg qimport -r <first>:<last>
-- where <first> and <last> are the first and last changesets
-- in the range of revisions you want to collapse
hg qpop <first>.diff
-- remove all except for the first patch from the queue
-- note: mq names patches <#>.diff when it imports them, so we're using that here
hg qfold <next>.diff
-- where <next> is <first>+1, then <first>+2, until you've reached <last>
hg qfinish -a
-- apply the folded changeset back into the repository
(Возможно, есть лучший способ сделать шаг qfold, но я не знаю об этом, так как обычно я использую TortoiseHg для этой операции.)
Сначала это кажется немного сложным, но как только вы начали использовать mq, это довольно просто и естественно - плюс вы можете делать с mq все, что угодно, что может быть очень удобно!
hg collapse
и hg histedit
- лучшие способы. Или, скорее, были бы лучшими способами, если бы они работали надежно ... Я получил histedit
, чтобы аварийно завершить работу с дампом стека в течение трех минут. Свернуть
не намного лучше.
Думаю, я мог бы поделиться двумя другими BKM:
<Ол> hg rebase --collapse
Это расширение распространяется с Mercurial. У меня еще не было проблем с этим. Возможно, вам придется поиграть в некоторые игры, чтобы обойти ограничения hg rebase
- в основном, он не любит перебазирование к предку в той же ветке, именованной или по умолчанию, хотя он допускает это, если перебазировка между (именованные) ветви.
Переместите репозиторий ( foo / .hg
) в рабочий каталог ( bar
) и его файлы. Не наоборот.
Некоторые люди говорили о создании двух деревьев клонов и копировании файлов между ними. Или исправление между ними. Вместо этого легче перемещать каталоги .hg
.
hg clone project work
... lots of edits
... hg pull, merge, resolve
hg clone project, clean
mv work/.hg .hg.work
mv clean/.hg work/.hg
cd work
... if necessary, pull, nerge, reconcile - but that would only happen because of a race
hg push
Это работает до тех пор, пока настоящие репозитории, деревья .hg
, не зависят от рабочего каталога и его файлов.
Если они не независимы ...
Я никогда не использовал Mercurial, но это очень похоже на то, о чем говорил Мартин Фаулер в своем блоге не так давно:
Почему бы просто не выполнить команду hg strip --keep
?
Затем вы можете зафиксировать все изменения как один.
HistEdit будет делать то, что вы хотите, но это, вероятно, излишне. Если единственное, что вам нужно, - это сложить несколько наборов изменений вместе, Расширение свертывания выполнит эту работу. р>
Предположим, у вас есть два неопубликованных коммита THIS
и THAT
в Mercurial, и им нравится объединяться в один коммит в THIS
point :: р>
... --> THIS --> ... --> THAT --> ... --> LAST
Убедитесь, что ваши коммиты не опубликованы ::
$ hg glog -r "draft() & ($THIS | $THAT)"
Обновить до LAST
commit ::
$ hg up
и импорт фиксирует до ЭТОГО
в MQ ::
$ hg qimport $THIS::.
Отмените все исправления и примените только сначала ЭТО
::
$ hg qpop -a
$ hg qpush
$ hg qapplied
... THIS ...
Присоединяйтесь к ЭТО
::
$ hg qfold $THATNAME
ПРИМЕЧАНИЕ . Чтобы найти имя THATNAME
, используйте ::
$ hg qseries
Примените все патчи и переместите их в историю репозитория ::
$ hg qpush -a
$ hg qfinish -a
Мой пост в блоге по теме Присоединение к двум коммитам в Mercurial . р>
Да, strip --keep
работает на вопрос автора. Но это немного отличалось от других, например, если у вас версия от 1 до 30, но вы хотите свернуть версию 12-15. Другие решения работают, но не strip --keep
. Р>