пятница, 2 июля 2010 г.

Человеческое лицо Subversion

Людям, поработавшим с децентрализованными системами контроля версий, нет необходимости перечислять все вкусности - которые они дают. Но, к сожалению, в сети много проектов, которые используют морально устаревшие централизованные системы контроля. Ладно бы еще subversion, но до сих пор нередко использование cvs.

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

Тащить стабильные ветки - совершенно неинформативно, Весь чейнджлог содержит только собщения о мердже. Следовательно надо тащить к себе транк, который в репозитории FreeBSD традиционно по cvs'овски называется HEAD.

Проблема в том что история FreeBSD - богатая, 200 тысяч ревизий. И как выяснилось, не всякая DVCS долетит до середины репозитория FreeBSD. Решил немного сравнить mercurial и git в этом плане.

Mercurial

Для Меркуриала я использую рекоммендуемое расширение hgsubversion.

Самый простой путь - hg clone svn+http://svn.freebsd.org/base/head очень легко может не сработать. Одна ошибка и Mercurial прерывает свое выполнение, не забыв при этом стереть все скачанное непосильным трудом.

Блин, зачем же я три часа тяну svn+http://svn.freebsd.org/base?

Лучше сделать hg init, потом добавить в .hg/hgrc default path:
[paths]
default = svn+http://svn.freebsd.org/base/head/
А после чего, спокойно, можно делать hg pull. В случае ошибок дальнейший пуллинг будет продолжаться с последней скачанной ревизии.

... прошло 5 часов.
Проблема еще в том что этот процесс продолжается ужасно много времени. Пока дошел до 13500/209640. До конца осталось примерно 55 часов... подождем...

... прошло 30 часов.
90800/209640. До конца осталось примерно столько же.

... Прошло 55 часов.
148054/209640

... Прошло 75 часов, опять аборт.
202063/209640

pulling from svn+http://svn.freebsd.org/base/head/
[r202063] imp: Cope with the move and if_timer going way.
abort: sys/mips/cavium/dev/rgmii/octeon_fau.c@2ef2ef595899: not found in manifest!

Ан нет, вру... необходимо указать опцию --stupid для команды pull. При этом меркуриал, похоже, извлекает весь срез целиком, и потом уже строит дельты. Ведь не зря он пишет после каждой ревизии: Fetching entire revision: branch creation with mods.

И вот наконец этот процесс завершился, заняв приблизительно 76 часов чистого времени.
Полученная история FreeBSD насчитывает ~150000 ревизий, за период с 1993 года.
И все это заняло на диске 767 MiB базы данных.
Само дерево насчитывает ~45.5 тысяч файлов и занимает объем 603 MiB.
Какой объем данных был выкачан при этом по сети - я затрудняюсь предположить, наверное несколько гигабайт.

Главное, что стоит запомнить:
  • Не используйте команду clone, init/pull значительно надежнее.
  • Некоторые ревизии вызывают ошибки, которые можно обойти путем указания для pull опции --stupid.
  • Но не надо скачивать все с указанием опции --stupid, это потребует значительно больше времени и трафика.

Git
Должен справиться с этим часов за 50, но с этим экспериментом я пожалуй повременю, через три недели вернусь из отпуска - проверю.