Переход от одного разработчика к нескольким в SVN

Недавно я устроился на новую работу, и до сих пор у них был только один разработчик. Использование Eclipse и Collabnet с Subversion. Таким образом, у него не было проблем с конфликтами и т. д. Тем более, что это полностью переписанное исходное приложение, поэтому нет конфликтов с каким-либо другим кодом.

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

Каталог SVN был построен без магистрали. Все находится непосредственно в корневом каталоге.

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

Если да, то как проще всего это изменить. Я видел эту ссылку, но она очень старая, и мне интересно, есть ли новый, более простой способ. Есть ли простой способ перемещения/в/trunk?


person theblitz    schedule 07.06.2012    source источник
comment
Похоже, самое время перейти на Git или Mercurial.   -  person malenkiy_scot    schedule 07.06.2012


Ответы (2)


Чаще фиксируйте и обновляйте.

Конфликты должны происходить, если только не создаются/редактируются разные участки кода. Чем раньше возникают конфликты (и, следовательно, чем они меньше), тем лучше. Ежедневного совершения недостаточно.

В идеале коммиты должны быть атомарными изменениями. Наименьшее возможное изменение, добавляющее что-то в код при сохранении стабильности и корректности. Другими словами, если вы добавляете 3 разные функции, а затем фиксируете, коммиты, вероятно, недостаточно малы. У каждой функции должен быть свой коммит. (Или, если какая-либо из функций не мала, вероятно, более одного коммита.)

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

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

Изменить: я, вероятно, должен упомянуть, что я ни в коем случае не являюсь экспертом по svn-workflow. Я работал в команде из 4 человек, использующей git около 6 месяцев, и в команде из 2 человек, использующей svn в течение нескольких лет. Этот пост основан на вещах, которые, как я заметил, помогли или навредили нам с течением времени.

person Corbin    schedule 07.06.2012
comment
Мы не можем зафиксировать частично готовый элемент. Код может еще даже не работать, но разработчик хочет зафиксировать его, чтобы теперь код находился в более безопасном месте, поскольку рабочие станции не имеют резервной копии, а сервер SVN имеет. - person theblitz; 07.06.2012
comment
@theblitz В зависимости от того, что означает частично завершенный, частично завершенные вещи обычно не следует совершать. Каждая ревизия в идеале должна представлять значимую ревизию программного обеспечения. То, что я имел в виду под большим примечанием о функциях, на самом деле было больше нацелено на функции, которые логически являются одной функцией с точки зрения клиента, но более чем одной частью с точки зрения кода (например, сложная страница поиска может иметь базовую страницу поиска). зафиксировано, а затем более расширенная страница поиска позже зафиксирована). - person Corbin; 07.06.2012
comment
Если разработчик использует svn для резервного копирования, это, вероятно, означает, что он слишком долго держит код. Если это из-за темпа работы, то решение не очень приятное. Если это связано со слишком широкими коммитами, это обычно можно исправить. Возможно, вам придется выбирать между удобством и чистотой репо. Например, если разработчик закончил что-то только на 1/4 пути, но в пятницу будет 5, это оставляет сложный выбор с точки зрения фиксации, если стабильность данных на рабочих станциях находится под вопросом. - person Corbin; 07.06.2012
comment
Как правило, это не проблема, так как обычно это не занимает больше дня или около того. Однако, когда мы создаем новые разделы или вносим большие изменения, могут возникнуть проблемы. Коммит незавершенного (и, возможно, даже некомпилируемого) кода вызовет проблемы у других, если они будут обновлять какой-либо код из SVN. - person theblitz; 07.06.2012
comment
Большие новые разделы часто появляются, когда в игру вступают ветки. Преимущество ветвления заключается в том, что вы можете изолировать ветвь кода от ствола, и, таким образом, он может быть настолько стабильным или нестабильным, насколько вы хотите, сохраняя при этом относительную стабильность ствола. Затем, как только ветвь выполнила свою задачу (если только она не должна быть всегда существующей ветвью), ее можно снова объединить в транк. Однако недостатком ветвления является то, что в зависимости от того, насколько далеко от ствола стала ветвь, слияние может быть чрезвычайно болезненным (хотя часто это неизбежно). - person Corbin; 07.06.2012
comment
Может быть, воспользоваться этой возможностью, чтобы отойти от Subversion, которая довольно сильно повреждена, и использовать что-то приличное, например, Mercurial или Git, которые позволяют локальные коммиты разработчика и действительно легкое слияние. - person artbristol; 07.06.2012
comment
Дело в том, что Subversion поставляется со специально разработанным интерфейсом с Collabnet. - person theblitz; 07.06.2012

Ветвление не должно быть необходимым в вашей повседневной работе. Просто пусть все работают с файлами в основном исходном каталоге. Может быть разумно переместить код в подкаталог (например, «/trunk»), чтобы у вас также были другие каталоги в корне (например, каталог для ветвей).

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

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

Хорошее время для создания ветки — когда вы выпускаете свое приложение. Создайте ветку с именем 1.X для первого выпуска. Затем продолжайте работу в направлении 2.0 в багажнике. В ветке 1.Х можно собрать релиз 1.0, а также позже релиз 1.1 и так далее (не мешая работе в сторону 2.0 в багажнике).

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

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

Release branches            __testing_1.X__..._rel_1.0___.._rel_1.1    ___2.X_branch_
                           /                                          /
___________trunk__________/_______trunk______________________________/____..
      \                                               /
       \_____really big feature for v2 only__________/ 

Feature branches

Для повседневной разработки вы можете использовать ветвление сколько угодно. Один из вариантов — одна ветвь на функцию, но вы, вероятно, обнаружите, что это создает больше проблем, чем решает для небольшой команды. Разрешать конфликты в SVN обычно намного проще, чем управлять несколькими ветвями и выполнять множество слияний. В других системах контроля версий (например, Git) ситуация иная.

person Anders Forsgren    schedule 07.06.2012