Чего Не Может Сделать Svn

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

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

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

Все шло хорошо.

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

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

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

И тут мы столкнулись с неожиданным для нас эффектом.

SVN хранит историю изменений, отправленных в ветку, в текстовом свойстве корневой папки.

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

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

.

И вот что случилось с нами.

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

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

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

.

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

В последнее время я все чаще слышу от друзей восторженные отзывы о распределенных системах контроля версий, в частности Mercurial и Git. И у меня возник вопрос: можно ли организовать такую сложную схему передачи изменений на этих системах? Прошу людей, пользующихся упомянутой или другими системами, подсказать, можно ли в замкнутом цикле передавать в них изменения без возникновения описанной проблемы? Например, на следующей диаграмме можно ли выполнить редактирование слиянием 8? И заблокирует ли система еще раз попытку передачи 9? SVN, например, заблокирует оба.



Чего не может сделать SVN

ВВЕРХ: цлом говорит, что Git позволит внести обе правки и, естественно, создаст коллизию в 9-м.

Вообще, в SVN можно тоже игнорировать блокировки, тогда эффект будет тот же.

ВВЕРХ: PQR предположил, что в Mercurial правки можно атомарно переносить с помощью расширения Transplant, а в Git — с помощью команды Cherry-Pick, но, судя по всему, в обоих случаях будут разрешены обе правки (8 и 9).

Теги: #svn #системы контроля версий #системы контроля версий

Вместе с данным постом часто просматривают: