SCM: Clone/checkout по медленным и неустойчивым каналам

Рассмотрим дефолтное поведение некоторых систем контроля ревизий при получение большого (>20 MiB) проекта по довольно медленной сети, а так же что происходит при разрыве соединения.
Рассмотрим именно дефолтное поведение с которым столкнется любой кто начнет использовать данные SCM, хотя это поведение можно и изменить.
Рассматривать будем следующие SCM: Subversion, Git, Mercurial.

Subversion

Проект: TortoiseSVN
Версия клиента: version 1.6.16 (r1073529)
Команда клиента: svn checkout http://tortoisesvn.googlecode.com/svn/trunk/

Checkout проекта

$ svn checkout http://tortoisesvn.googlecode.com/svn/trunk/ TortoiseSVN
A TortoiseSVNtest
A TortoiseSVNtestblame
A TortoiseSVNtestblamewithmergeinfo.blame
A TortoiseSVNtestblamemissingrevs.blame
A TortoiseSVNtestblametest.blame
A TortoiseSVNtestiDiff
A TortoiseSVNtestiDiffMultipageTiffs.7z
A TortoiseSVNtestiDiffexample-vista-icon-2.ico
A TortoiseSVNtestCache
A TortoiseSVNtestCachestdafx.h
A TortoiseSVNtestCacheCacheDlg.h
A TortoiseSVNtestCacheCache.vcxproj.filters
A TortoiseSVNtestCacheCache.cpp
A TortoiseSVNtestCacheCache.rc
A TortoiseSVNtestCacheCache.h
A TortoiseSVNtestCacheres
A TortoiseSVNtestCacheresCache.manifest
A TortoiseSVNtestCacheresCache.rc2
A TortoiseSVNtestCacheresCache.ico
A TortoiseSVNtestCachestdafx.cpp
A TortoiseSVNtestCacheCacheDlg.cpp
A TortoiseSVNtestCacheresource.h
A TortoiseSVNtestCacheCache.vcxproj

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

Разрыв коннекта

A TortoiseSVNcontribotherpo-checkerrootimagesflagsIslamic Conference.png
A TortoiseSVNcontribotherpo-checkerrootimagesflagsSudan.png
svn: REPORT of '/svn/!svn/vcc/default': Could not read response body: Удаленный хост принудительно разорвал существующее подключение.
(http://tortoisesvn.googlecode.com)

Продолжение checkout

Для продолжения с точки разрыва, нужно перейти в директорию куда производился checkout проекта и запустить обновление проекта: svn up
$ svn up
A contribotherpo-checkerrootimagesflagsFlags.zip
A contribotherpo-checkerrootimagesflagsRwanda.png
A contribotherpo-checkerrootimagesflagsAfrican Union.png
A contribotherpo-checkerrootimagesflagsJordan.png
A contribotherpo-checkerrootimagesflagsMontenegro.png
A contribotherpo-checkerrootimagesflagsVatican City.png

Git

Проект: TortoiseGit
Версия клиента: version 1.7.9.msysgit.0
Команда клиента: git clone https://code.google.com/p/tortoisegit/

Clone проекта

$ git clone https://code.google.com/p/tortoisegit/ TortoiseGit
Cloning into 'TortoiseGit'...
remote: Counting objects: 26197, done.
remote: Finding sources: 100% (26197/26197), done.
remote: Total 26197 (delta 19808)
Receiving objects: 5% (1310/26197), 249.98 KiB | 59 KiB/s

Причем проценты относятся только к количеству полученных объектов, где каждый объект это комплект изменений с разным размером. У меня был случай когда один из 4000 объектов весил 100 MiB, а весь проект не более 110. Таким образом хотя мы и видим сам прогресс, но не знаем сколько это будет продолжаться.

Разрыв коннекта

error: RPC failed; result=56, HTTP code = 200B | 359 KiB/s
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed

Продолжение clone

Продолжить после разрыва коннекта уже не выйдет — только начинать заново.

Mercurial

Проект: TortoiseHg
Версия клиента: 1.8.1
Команда клиента: hg clone https://bitbucket.org/tortoisehg/thg/

Clone проекта

$ hg clone https://bitbucket.org/tortoisehg/thg/ TortoiseHg
requesting all changes
adding changesets
adding manifests
adding file changes

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

Разрыв коннекта

transaction abort!
rollback completed
abort: ╧ЁюуЁрььр эр тр°хь їюёЄ-

Продолжение clone

Продолжить после разрыва коннекта уже не выйдет — только начинать заново.

Выводы

Если вероятность разрыва коннекта совсем не нулевая, то получение исходников проекта в git и mercurial может превратиться мучение, а subversion позволит нам продолжать загрузку по победного конца.
На медленных каналах только git позволяет получить хоть какое-то представление о том сколько еще ждать.

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.