[personal profile] dememax
Специально для [livejournal.com profile] deterre

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

Действительно ли дело обстоит так, как заявляют разработчики Subversion, и копирование дешевое, а пессимизм Линуса о быстродействии создания копии в SVN в том самом видео не оправдался.

Итак, имеем:
  • usr@hst $ uname -a
    Linux hst 2.6.27.29-0.1-xen #1 SMP 2009-08-15 17:53:59 +0200 i686 i686 i386 GNU/Linux
    при этом как бы два ядра Intel(R) Xeon(R) CPU E5205 @ 1.86GHz, памяти 2G
  • Современную версию SVN: 1.6.3, r38063, compiled Jul 10 2009 (в соответствии с принятым графиком выпуска релизов, 1.7 должна выйти в начале следующего года)
  • Репозиторий в SVN в формате FSFS, общим объемом 7.4G на диске, с количеством ревизий около 230 тысяч
  • Каталог в этом репозитории, последняя версия которого занимает 1.8G на диске (если удалить все папки «.svn»), файлы могут иметь и 100 ревизий, и больше.
  • Работаем локально, используя протокол «file:/»
  • Некоторые имена в листингах изменены для конспирации, но не цифры

Исходное состояние

Смотрим на репозиторий:
usr@hst $ du -s -h /home/devel/some/svn
7.4G    /home/devel/some/svn
usr@hst $ du -s -b /home/devel/some/svn
6394885893      /home/devel/some/svn
usr@hst $ find /home/devel/some/svn -type d | wc
    469     469   16142
usr@hst $ find /home/devel/some/svn -type f | wc
 459058  459058 18838117
usr@hst $

Смотрим на каталог:
usr@hst:~/tmp $ svn co file:///home/devel/some/svn/project/trunk
usr@hst:~/tmp $ find trunk -type d -name .svn -exec rm -r -f {} \;
usr@hst:~/tmp $ du -s -h trunk
1.8G    trunk
usr@hst:~/tmp $ du -s -b trunk
1723226369      trunk
usr@hst:~/tmp $ find trunk -type d | wc
   3609    3609  157100
usr@hst:~/tmp $ find trunk -type f | wc
  59815   59844 3184332
usr@hst:~/tmp $


Копирование

Теперь осуществляем копирование:
usr@hst:~/tmp $ `which time` svn cp -m "SVN copy test." file:///home/devel/some/svn/project/trunk file:///home/devel/some/svn/branches/copytest

Committed revision 229516.
0.01user 0.00system 0:00.20elapsed 5%CPU (0avgtext+0avgdata 0maxresident)k
56inputs+152outputs (0major+1008minor)pagefaults 0swaps
usr@hst:~/tmp $
Недурно. Практически сразу. «ч.т.д.»

Состояние репозитория

И как же изменился репозиторий в цифрах:
usr@hst $ du -s -b /home/devel/some/svn
6394886868      /home/devel/some/svn
usr@hst $ find /home/devel/some/svn -type d | wc
    469     469   16142
usr@hst $ find /home/devel/some/svn -type f | wc
 459060  459060 18838201
usr@hst $
Вырос всего на 975 байт, каталогов столько же, файлов стало на два больше. Т.е. и по времени быстро, да и по размеру — изменений совсем мало. Очевидно, копия не реальная, а лишь «пометка».

Первое изменение копии

Ну, хорошо, а что же произойдет, если изменить в копии файлик, который к тому же лежит глубоко?
usr@hst:~/tmp $ `which time` svn co file:///home/devel/some/svn/branches/copytest/one/two/three
A    three/firstfile
  ....
A    three/lastfile
 U   three
Checked out revision 229516.
0.03user 0.00system 0:01.14elapsed 3%CPU (0avgtext+0avgdata 0maxresident)k
1104inputs+1232outputs (0major+1140minor)pagefaults 0swaps
usr@hst:~/tmp $ cd three
usr@hst:~/tmp/three $ echo "/*** Just to test copy on write ***/" >> somefile
usr@hst:~/tmp/three $ `which time` svn ci -m "Just to test copy on write."
Sending        somefile
Transmitting file data .
Committed revision 229517.
0.00user 0.01system 0:01.09elapsed 1%CPU (0avgtext+0avgdata 0maxresident)k
184inputs+472outputs (0major+1274minor)pagefaults 0swaps
usr@hst:~/tmp/three $
Первое изменение копии прошло без особого напряжения.

Состояние репозитория

Как теперь выглядит репозиторий со стороны?
usr@hst $ du -s -b /home/devel/some/svn
6394900305      /home/devel/some/svn
usr@hst $ find /home/devel/some/svn -type d | wc
    469     469   16142
usr@hst $ find /home/devel/some/svn -type f | wc
 459062  459062 18838285
usr@hst $
Это уже что-то — 13437 байт прибавилось и опять два файлика.

Второе изменение копии

Напоследок, ещё одно изменение в другом каталоге на том же уровне вложенности:
usr@hst:~/tmp $ `which time` svn co file:///home/devel/some/svn/branches/copytest/one/two/four
A    four/firstfile
  ....
A    four/lastfile
 U    four
Checked out revision 229517.
0.01user 0.00system 0:00.44elapsed 4%CPU (0avgtext+0avgdata 0maxresident)k
368inputs+416outputs (0major+1085minor)pagefaults 0swaps
usr@hst:~/tmp $ cd four
usr@hst:~/tmp/four $ echo "/*** Just to test copy on write ***/" >> somefile
usr@hst:~/tmp/four $ `which time` svn ci -m "Just to test copy on write. Second commit."
Sending        somefile
Transmitting file data .
Committed revision 229518.
0.01user 0.01system 0:00.86elapsed 2%CPU (0avgtext+0avgdata 0maxresident)k
80inputs+384outputs (0major+1219minor)pagefaults 0swaps
usr@hst:~/tmp/four $

Состояние репозитория

Репозиторий:
usr@hst $ du -s -b /home/devel/some/svn
6394911759      /home/devel/some/svn
usr@hst $ find /home/devel/some/svn -type d | wc
    469     469   16142
usr@hst $ find /home/devel/some/svn -type f | wc
 459064  459064 18838369
usr@hst $
Увеличение на 11454 байта, меньше, чем для первого изменения, и те же два файлика.

Итоги

Т.к. время выполнения операций различается незначительно, а количество каталогов в репозитории оставалось неизменным, остановлюсь на следующих показателях.
Состояние репозиторияРазмер строки комментария к изменению, символовРазмер изменений в файле, символовКоличество файлов репозитория, шт.Размер репозитория, байтРазница с предыдущим состоянием, байт
Исходное состояние--4590586394885893-
С копией14-4590606394886868+975
После первого изменения в копии27264590626394900305+13437
После второго изменения в копии42264590646394911759+11454


Читайте также в моём блоге: про переход с CVS на GIT в Mail.ru и Добавил в дайджест блога '11

Date: 2009-11-04 06:13 pm (UTC)
From: [identity profile] itman.livejournal.com
Ты знаешь, что после того, что мне рассказали про ветки в CVS (я каким-то чудом умудрился не наступить на эти грабли), я пришел к выводу, что SVN - это все-таки правильная штука. Правда у нас с ней периодически возникают локальные геморрои. То там народ ссылки поставит, и svn up на каталог выше не работает, то авторизацию через ж сделают, так что нужно каждый день авторизоваться. Но так, вообще, ничего, шустро.
Слушай, а скажи, пожалуйста, а можно ли куски репозитория SVN копировать также как куски репозитория CVS?
From: [identity profile] itman.livejournal.com
Нет, я имею в виду, что если у тебя есть доступ до реального репозитория, то ты можешь взять и, скажем, скопировать проект в другой репозиторий? В CVS это делается элементарно.

Date: 2009-11-04 06:48 pm (UTC)
From: [identity profile] alexott.livejournal.com
основная проблема с svn, то что общий репозиторий засирается, если каждый девелопер будет лепить ветки.
я решил эту проблему путем использования git-svn - центральный репозиторий в svn, там ветки с релизами и т.п., а я все эксперименты провожу у себя, создавая новую ветку на каждый чих. а потом уже коммичу отлаженные куски кода в нужную ветку.
ну и слияние git делает правильней чем svn...

Date: 2009-11-04 07:28 pm (UTC)
From: [identity profile] rezdm.livejournal.com
В смысле "засирается"?

svn://.../some_product/
svn://.../some_product/releases (tags/...) -- метки релизов, как ни назови, что идёт в продакшн
svn://.../some_product/trunk (devel/...) -- текущая разработка
svn://.../some_product/branches -- то, где девелоперы плодят ветки, экспериментальные релизы, прочая
Да, в branches/ будет много барахла. И пусть. Для этого и создано.

Или я не понял Вашей мысли.

Date: 2009-11-04 07:30 pm (UTC)
From: [identity profile] alexott.livejournal.com
у меня вполне стандартная практика - 1-3 новых ветки в день, как будет выглядеть каталог branches после пары лет разработки?

(no subject)

From: [identity profile] rezdm.livejournal.com - Date: 2009-11-04 08:06 pm (UTC) - Expand

(no subject)

From: [identity profile] alexott.livejournal.com - Date: 2009-11-04 08:19 pm (UTC) - Expand

(no subject)

From: [identity profile] rezdm.livejournal.com - Date: 2009-11-04 08:28 pm (UTC) - Expand

(no subject)

From: [identity profile] alexott.livejournal.com - Date: 2009-11-04 09:02 pm (UTC) - Expand

(no subject)

From: [identity profile] rezdm.livejournal.com - Date: 2009-11-04 09:16 pm (UTC) - Expand

(no subject)

From: [identity profile] alexott.livejournal.com - Date: 2009-11-04 09:25 pm (UTC) - Expand

Date: 2009-11-04 07:12 pm (UTC)
From: [identity profile] ex-sanaris.livejournal.com
git & mercurial как-то больше доставляют если честно.
но для меня дело вкуса

Date: 2009-11-04 08:34 pm (UTC)
From: [identity profile] rezdm.livejournal.com
Макс, почитал я то, что там по ссылке (перевод расшифровки какого-то спича Линуса).

1) Во-первых, он сразу говорит, что ему нужна _распределённая_ система. Все остальные он сразу считает гамном. Это уже слегка не очень-то
2) Perforce?… Perforce. Ну да, извините. Да, он, конечно же, лучше, чем CVS.
[Слушатели смеются] Но все равно это по сути CVS.
Перфорс тоже самое, что цвс? Ха.
3) Там дальше, где он говорит сначала про ветки, потом про коммиты.
Так как раз пжалста! Комитить в свою ветку до появления стабильного "проходящего тесты", потом раздавать всем.
4) После второго вопроса из зала пошёл какой-то бред
5) В чём проблема слияния веток в свн я не понял. В цвс понятно. Но в свн. Да, если всё разъехалось в смысле иходников к чертям, то оно по-любому придётся ручками каждое файло проверять.
6) Content Management
Чем тот же svn не устраивает? Те же ицы, вид сбоку. Опять же, если всё в одной ветке, то всё просто. А вот что хотелось бы посмотреть, как отыскивать изменения, которые пришли из другой ветки через пяток мержей.


Вобщем "несогласная я". alexott навёл на юз-кейс (толи перевод, толи в изначальной речи это мутно прозвучало): когда есть оупен-сорс прожект, и хочется вовсю поиграться с функционалом, при этом иметь свои ветки, проч., и комитить в общий колхоз действительно не надо. Вот тут да, надо подумать.

Date: 2009-11-04 09:04 pm (UTC)
From: [identity profile] alexott.livejournal.com
svn отвратительно сливает код с патчами, которые прошли через несколько веток (я смерджил от кого-то, кто смержил из trunk, потом я поработал, и смержил сам из trunk - получаю проблемы). хоть они и улучшились в последнее время, но все еще есть проблемы...

Date: 2009-11-04 09:17 pm (UTC)
From: [identity profile] rezdm.livejournal.com
А кто-то умеет сильно лучше? Вот именно про это я и писал в п.6 выше. Из того, с чем работал я (см здесь же) толком, чтобы рррраз и готово -- никто не может.
From: [identity profile] rezdm.livejournal.com
0) Ну так мерять-то начали из-за него
1)
2) Пока мною увиден только один юз-кейс.
3) Так он что с чем меряет? С цвс-ом или с свн-ом?
4)
5) Не, ну в цвс слияние -- это просто адъ. Он там правильно описал процесс с оттягиванием "того самого дня". И с 1.4 я работал себе вполне, кстати. Нормуль. Опять же, повторюсь мёрж не будет простым никогда, кроме "транк не изменился", отбранчевал-поправил-влил обратно в бранч. Всё остальное, конда надо вливать через несколько бранчей, когда конфликты -- бесплатно не будет.Будет тяжело и ручками. Благо, что хоть не с цвс, где с этим просто полный улёт.
6) Всё, что там описывается в слайде Content M-t укладывается легко в svn.

И опять же, он упоминает commit access, а сам-то хитрец, только сам и вливает.

Date: 2009-11-05 08:04 am (UTC)
From: [identity profile] zamotivator.livejournal.com
5) mercurial/git позволяют мёржить длинные истории "зигзагом" - без проблем с отслеживанием ancentor'ов

Date: 2009-11-07 04:18 am (UTC)
From: [identity profile] kirhgoff.livejournal.com
забавно - очень в тему пост. недавно на конфйеренции был и слушал рассказ чувака про централизованные и распределененные вершн контроли. он примерно к тому же выводу пришел что и ваш коллективный разум. а про бранчи в svn очень ты мне все разьяснил. Я все гадал - а как быть если у меня таги ставятся по пять штук в день - думал весь репо копируется и типа все засрется быстро. ан нет, умные мужчины писали svn

Re: умные мужчины писали svn

Date: 2009-11-07 07:59 am (UTC)
From: [identity profile] kirhgoff.livejournal.com
про git я слышал на конфернци что он вообще сборище дерьмовых скриптов
там как то хорошо отзывались о mercurial и bazaar - типа что он были сделаны по человечески

Re: умные мужчины писали svn

Date: 2009-11-07 08:20 am (UTC)
From: [identity profile] kirhgoff.livejournal.com
слушай а какой у тебя емейл?

Profile

dememax

May 2023

S M T W T F S
 123456
78910111213
14151617181920
21 2223 24252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 7th, 2026 07:29 pm
Powered by Dreamwidth Studios