Ветвление с Mercurial SCM

Итак, прямо сейчас я изучаю Ruby on Rails и работаю над книгой «Гибкая веб-разработка с Rails». Я также решил, что хочу попробовать Mercurial, потому что я читал о распределенных SCM, и это кажется идеальной ситуацией. Однако я по-прежнему предпочитаю отправлять свой код удаленно на свой Linux VPS на тот случай, если мой жесткий диск решит погрузиться в воду.

Итак, мой вопрос касается ветвления в Mercurial. Прямо сейчас у меня настроен удаленный репозиторий, и я могу легко отправлять изменения через SSH (черт возьми, я даже создал сайт Nginx FastCGI, который тоже позволяет мне отправлять). Однако я бы хотел создавать ветки для каждой главы по мере того, как я работаю над ними, чтобы я мог вести хорошо организованную историю своего прогресса по книге. Итак, вот что я делаю:

$ hg branch chapter-10
(do chapter 10 stuff)
$ hg commit -m "Chapter 10 complete"
$ hg update default
$ hg merge chapter-10
$ hg commit -m "Merging chapter 10 into default"
$ hg push

Как только я выполняю инструкцию push, я получаю от Mercurial следующее сообщение:

pushing to ssh://myserver/hg/depot
searching for changes
abort: push creates new remote branch 'chapter-10'!
(did you forget to merge? use push -f to force)

Итак, на этом этапе я снова пытаюсь сделать hg merge, и он говорит мне, что нечего объединять, что, очевидно, верно, потому что я только что слил это. Когда я принудительно нажимаю -f, все кажется хорошо, и даже веб-интерфейс показывает соответствующие ветки.

Подводя итог, мой вопрос прост: правильно ли я делаю это? Есть ли более подходящий способ сделать это с помощью Mercurial (т. Е. «Mercurial way»)? Честно говоря, я просто хочу, чтобы репозиторий служил резервной копией. Я фанат распределенной модели SCM, но мне кажется, что форсировать ее «грязно». Любое понимание очень ценится! Заранее спасибо.


person Scott Anderson    schedule 20.01.2010    source источник
comment
Ваше намерение: а) иметь серию контрольных точек вашей работы по мере прохождения глав или б) иметь несколько глав, открытых для одновременного редактирования в разных ветвях?   -  person Tarydon    schedule 20.01.2010
comment
Вариант A - это мое намерение здесь, но в командном сценарии я мог бы увидеть ценность и в варианте B.   -  person Scott Anderson    schedule 20.01.2010


Ответы (3)


push -f - правильный вариант для вашего случая, и в прошлом месяце было обсуждение добавить эту команду, когда появляется это предупреждение "push creates new remote branch": см. issue 1513.

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


В более общем плане вы можете использовать ветку, если вы пишете свою главу параллельно, и вы хотите объединить их только в определенный (стабильный) момент времени.

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

person VonC    schedule 20.01.2010
comment
Спасибо за ссылки. Очень информативно. Похоже, я пытаюсь использовать ветки, где теги подходят лучше. - person Scott Anderson; 21.01.2010

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

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

Теги (или метки) используются в первую очередь для создания маркера, обозначающего некоторую важность для версии кода. Например, если вы хотите отметить завершение главы 10, вы просто помечаете все текущие версии тегом «chapter-10». Нет необходимости в ветвлении. Вы можете перейти от версии с тегами в любой момент в будущем, если это будет необходимо по какой-либо причине.

person Jiri Klouda    schedule 20.01.2010
comment
Я согласен. Учитывая, что вы всегда можете вернуться и выполнить ответвление из любого места, где вам нужно, предварительное создание веток кажется очевидным примером YAGNI. - person Carl Meyer; 20.01.2010

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

person Ringding    schedule 20.01.2010