Я просто видел первое учебное руководство Мерзавца по http://blip.tv/play/Aeu2CAI.
Как Мерзавец хранит все версии всех файлов, и как это может все еще быть более экономично в пространстве, чем Подверсия, которая сохраняет только последнюю версию кода?
Я знаю, что это может быть сделано с помощью сжатия, но это было бы за счет скорости, но это также говорит, что Мерзавец намного быстрее (хотя то, где это получает максимум, является тем, что большинство его операций в режиме офлайн).
Так, мое предположение - это
uncompression + work
еще быстрее, чем network_fetch + work
Я корректен? Даже близко?
Я предполагаю, что вы спрашиваете, как возможно, чтобы клон git (полный репозиторий + проверка) был меньше, чем проверенные исходные коды в Subversion. Или вы имели в виду что-то другое?
На этот вопрос ответят в комментариях
Во-первых, вы должны принять во внимание, что при оформлении заказа (рабочая версия) Subversion сохраняет исходную копию (последняя версия) в тех .svn
подкаталоги. Оригинальная копия хранится в Subversion без сжатия.
Во-вторых, git использует следующие методы для уменьшения размера репозитория:
Во-первых, любая операция, связанная с сетью, будет намного медленнее, чем локальная операция. Поэтому, например, сравнение текущего состояния рабочей области с какой-либо другой версией или получение журнала (истории), который в Subversion включает сетевое соединение и передачу по сети, а в Git является локальной операцией, конечно, будет намного медленнее в Subversion, чем в Git. КСТАТИ. в этом разница между централизованными системами контроля версий (с использованием рабочего процесса клиент-сервер) и распределенными системами контроля версий (с использованием однорангового рабочего процесса), а не только между Subversion и Git.
Во-вторых, если я правильно понимаю, в настоящее время ограничением является не процессор, а ввод-вывод (доступ к диску). Следовательно, возможно, что выигрыш от необходимости читать меньше данных с диска из-за сжатия (и возможности mmap их в памяти) преодолеет потери от необходимости распаковывать данные.
В-третьих, Git был разработан с учетом производительности (см., Например, Страница GitHistory в Git Wiki):
core.trustctime
конфигурационная переменная). pack.depth
, которое по умолчанию равно 50. Git имеет дельта-кеш для ускорения доступа. Существует (сгенерированный) индекс packfile для быстрого доступа к объектам в packfile. git log
» как можно быстрее, и вы видите ее почти сразу, даже если создание полной истории займет больше времени; он не дожидается создания полной истории перед ее отображением. Я не хакер Git и, вероятно, пропустил некоторые приемы и приемы, которые Git использует для повышения производительности. Однако обратите внимание, что Git активно использует для этого POSIX (например, файлы с отображением памяти), поэтому выигрыш может быть не таким большим в MS Windows.
Не полный ответ, но эти комментарии (от AlBlue ) может помочь в вопросе, касающемся управления пространством:
Здесь есть пара вещей, которые стоит уточнить.
Во-первых, возможно иметь более крупный репозиторий Git, чем репозиторий SVN ; Надеюсь, я не имел в виду, что этого не было. Однако на практике обычно бывает так, что репозиторий Git занимает меньше места на диске, чем эквивалентный репозиторий SVN.
Одна вещь, которую вы цитируете, - это единственный репозиторий SVN Apache, который, очевидно, огромен. Однако достаточно взглянуть наgit.apache.org
, и вы заметите, что каждый проект Apache имеет свой собственный репозиторий Git. Что действительно необходимо, так это сравнение сопоставимых; другими словами, проверка проекта (abdera) SVN по сравнению с клоном репозитория (abdera) Git .Мне удалось проверить
git: //git.apache.org/abdera.git
. На диске заняло 28,8Мб.
Затем я проверил версию SVNhttp://svn.apache.org/repos/asf/abdera/java/trunk/
, и она занимала 34,3 МБ.
Оба числа были взяты из отдельно смонтированного раздела в ОЗУ, а указанное число было количеством байтов, взятых с диска.
При использованииdu -sh
в качестве средства тестирования, проверка Git составляла 11 МБ, а проверка SVN - 17 МБ.Версия Apache Abdera для Git позволяла мне работать с любой версией истории до текущего выпуска включительно; у SVN будет только резервная копия текущей проверенной версии. Но при этом занимает меньше места на диске.
Как, спросите вы?
Ну, с одной стороны, SVN создает намного больше файлов . В кассе SVN 2959 файлов; в соответствующем репозитории Git 845 файлов.
Во-вторых, в то время как SVN имеет папку
.svn
на каждом уровне иерархии, репозиторий Git имеет только один репозиторий.git
на верхнем уровне . Это означает (среди прочего), что переименование из одного каталога в другой имеет относительно меньшее влияние в Git, чем в SVN, что, по общему признанию, уже оказывает относительно небольшое влияние.В-третьих, Git хранит свои данные как сжатые объекты, тогда как SVN хранит их как несжатые копии . Зайдите в любой каталог
.svn / text-base
, и вы найдете несжатые копии (базовых) файлов.
В Git есть механизм для сжатия всех файлов (и, действительно, всей истории) в файлы пакетов. В случае Абдеры.git / objects / pack /
содержит единственный файл .pack (содержащий всю историю) в файле размером 4,8 Мбайт.
Таким образом, размер репозитория (примерно) равен размеру текущего извлеченного кода в этом случае, хотя я не ожидал, что так будет всегда.В любом случае, вы правы в том, что история может увеличиваться до размера, превышающего общий размер текущей кассы; но из-за того, как работает SVN, он действительно должен быть в два раза больше, чтобы иметь большое значение. Даже в этом случае уменьшение дискового пространства не является главной причиной для использования DVCS; Конечно, для некоторых вещей это преимущество, но это не настоящая причина, по которой люди его используют.
Обратите внимание, что Git (и Hg, и другие DVCS) действительно страдают от проблемы, когда (большие) двоичные файлы возвращаются, а затем удаляются, поскольку они все равно будут отображаться в репозитории и занимать место, даже если они ' повторно не актуальный. Сжатие текста заботится о подобных вещах для текстовых файлов, но двоичные файлы представляют собой большую проблему. (Существуют административные команды, которые могут обновлять содержимое репозиториев Git, но они имеют несколько более высокие накладные расходы / административные расходы, чем CVS; git filter-branch похож на
svnadmin dump / filter / load
.)
Как что касается скорости, я упомянул об этом в своем ответе « Насколько быстро git превосходит подрывную деятельность с удаленными операциями? » (например, Линус сказал в своей презентации Google : (перефразируя здесь) «что-нибудь использование сети просто убьет производительность ")
И документ GitBenchmark , упомянутый Якубом Наребски , является хорошим дополнением, хотя он не имеет прямого отношения к Subversion.
В нем перечислены операции, которые необходимо контролировать на DVCS с точки зрения производительности.
Другие тесты Git упоминаются в этом вопросе SO .