С Mercurial, как я могу" сжать " серию наборов изменений в один перед нажатием?



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



теперь у меня есть 3 набора изменений, которые я действительно хотел бы нажать на пульт репозиторий как один набор изменений с сообщением "реализация функции X", например.



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

647   10  

10 ответов:

Да, вы можете сделать это с патчами: Предположим, что ваша работа находится в наборах изменений от 100 до 110 включительно

  1. создать патч:

    % hg export -o mypatch 100:110 --git

  2. обновление до 99:

    % hg update 99

  3. применить патч с --no-commit (в противном случае вы получите все ваши наборы изменений обратно):

    % hg import --no-commit mypatch

  4. применить все изменения в один раз:

    % hg commit

  5. теперь у вас есть две головы (110 и 111), которые должны быть эквивалентны с точки зрения файлов, которые они производят в вашем рабочем каталоге-возможно, diff их для здравомыслия, прежде чем удалять старые:

    % hg strip 100

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

Если вы используете TortoiseHg, используйте can просто выберите две ревизии (используйте CTRL для выбора не последующих), щелкните правой кнопкой мыши и выберите "История Сжимать".

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

вы можете просто удалить старые списки изменений, если они вам больше не нужны: используйте MQ расширения для оно. Опять же, в TortoiseHg: щелкните правой кнопкой мыши на первом списке изменений, который должен быть разделен со всеми его потомками, "Изменить Историю - > Strip".

мой предпочтительный метод использования 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 аварии с дампом стека в течение трех минут. Collapse не намного лучше.

Я подумал, что могу поделиться двумя другими BKMs:

  1. hg rebase --collapse

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

  2. переместить в хранилище (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, но это звучит очень похоже на то, что Мартин Фаулер говорил о своем блоге не так давно:

http://martinfowler.com/bliki/MercurialSquashCommit.html

почему бы просто не ?

затем вы можете зафиксировать все изменения как один фиксатор.

HistEdit будет делать то, что вы хотите, но это, вероятно, перебор. Если единственное, что вам нужно, это сложить некоторые наборы изменений вместе Крах Расширение сделает работу.

Предположим, у вас есть два неопубликованных THIS и THAT коммиты в Mercurial и как их объединить в один коммит на THIS точка::

... --> THIS --> ... --> THAT --> ... --> LAST

убедитесь, что ваши коммиты не публикуются::

$ hg glog -r "draft() & ($THIS | $THAT)"

обновление LAST commit::

$ hg up

и импорт совершает до THIS в MQ::

$ hg qimport $THIS::.

Un-применить все патчи и применять только первый THIS::

$ hg qpop -a
$ hg qpush
$ hg qapplied
... THIS ...

вступить с THAT::

$ hg qfold $THATNAME

Примечание найти имя THATNAME use::

$ hg qseries

применить все патчи и переместить их в хранилище истории::

$ hg qpush -a
$ hg qfinish -a

мой блог по теме соединение двух коммитов в Mercurial.

Comments

    Ничего не найдено.