Как Мерзавец оставляет свободное место и быстр одновременно?

Я просто видел первое учебное руководство Мерзавца по http://blip.tv/play/Aeu2CAI.

Как Мерзавец хранит все версии всех файлов, и как это может все еще быть более экономично в пространстве, чем Подверсия, которая сохраняет только последнюю версию кода?

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

Так, мое предположение - это

  • Мерзавец сжимает данные экстенсивно
  • Это еще быстрее потому что uncompression + work еще быстрее, чем network_fetch + work

Я корректен? Даже близко?

37
задан Peter Mortensen 28 January 2014 в 17:07
поделиться

2 ответа

Я предполагаю, что вы спрашиваете, как возможно, чтобы клон git (полный репозиторий + проверка) был меньше, чем проверенные исходные коды в Subversion. Или вы имели в виду что-то другое?

На этот вопрос ответят в комментариях


Размер репозитория

Во-первых, вы должны принять во внимание, что при оформлении заказа (рабочая версия) Subversion сохраняет исходную копию (последняя версия) в тех .svn подкаталоги. Оригинальная копия хранится в Subversion без сжатия.

Во-вторых, git использует следующие методы для уменьшения размера репозитория:

  • каждая версия файла сохраняется только один раз; это означает, что если у вас есть только две разные версии какого-либо файла в 10 ревизиях (10 коммитов), git хранит только эти две версии, а не 10.
  • объекты (и дельты, см. Ниже) хранятся в сжатом виде; текстовые файлы, используемые в программировании, сжимаются очень хорошо (около 60% от исходного размера, или 40% уменьшения размера из-за сжатия)
  • после переупаковки объекты сохраняются в разделенной форме, в отличие от некоторых других версий; дополнительно git пытается упорядочить дельта-цепочки таким образом, чтобы дельта состояла в основном из удалений (в обычном случае растущих файлов это происходит в порядке недавности); Дельты IIRC также сжаты.

Производительность (скорость операций)

Во-первых, любая операция, связанная с сетью, будет намного медленнее, чем локальная операция. Поэтому, например, сравнение текущего состояния рабочей области с какой-либо другой версией или получение журнала (истории), который в Subversion включает сетевое соединение и передачу по сети, а в Git является локальной операцией, конечно, будет намного медленнее в Subversion, чем в Git. КСТАТИ. в этом разница между централизованными системами контроля версий (с использованием рабочего процесса клиент-сервер) и распределенными системами контроля версий (с использованием однорангового рабочего процесса), а не только между Subversion и Git.

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

В-третьих, Git был разработан с учетом производительности (см., Например, Страница GitHistory в Git Wiki):

  • Индекс хранит статистическую информацию для файлов, и Git использует ее, чтобы решить, не проверяя файлы, были ли файлы изменены или нет (см., Например, core.trustctime конфигурационная переменная).
  • Максимальная дельта-глубина ограничена значением pack.depth , которое по умолчанию равно 50. Git имеет дельта-кеш для ускорения доступа. Существует (сгенерированный) индекс packfile для быстрого доступа к объектам в packfile.
  • Git старается не трогать файлы, которые ему не нужны. Например, при переключении ветвей или перемотке на другую версию Git обновляет только те файлы, которые изменились. Следствием этой философии является то, что Git поддерживает только минимальное расширение ключевых слов (по крайней мере, из коробки).
  • Git использует свою собственную версию библиотеки LibXDiff , в настоящее время также для сравнения и слияния, вместо вызова внешнего инструмента сравнения / внешнего слияния.
  • Git пытается минимизировать задержку , что означает хорошую воспринимаемую производительность. Например, он выводит первую страницу « git log » как можно быстрее, и вы видите ее почти сразу, даже если создание полной истории займет больше времени; он не дожидается создания полной истории перед ее отображением.
  • При получении новых изменений Git проверяет, какие объекты у вас общие с сервером, и отправляет только (сжатые) различия в виде тонкого файла пакета. По общему признанию, Subversion может (или, возможно, по умолчанию) также отправлять только различия при обновлении.

Я не хакер Git и, вероятно, пропустил некоторые приемы и приемы, которые Git использует для повышения производительности. Однако обратите внимание, что Git активно использует для этого POSIX (например, файлы с отображением памяти), поэтому выигрыш может быть не таким большим в MS Windows.

59
ответ дан 27 November 2019 в 04:35
поделиться

Не полный ответ, но эти комментарии (от AlBlue ) может помочь в вопросе, касающемся управления пространством:

Здесь есть пара вещей, которые стоит уточнить.

Во-первых, возможно иметь более крупный репозиторий Git, чем репозиторий SVN ; Надеюсь, я не имел в виду, что этого не было. Однако на практике обычно бывает так, что репозиторий Git занимает меньше места на диске, чем эквивалентный репозиторий SVN.
Одна вещь, которую вы цитируете, - это единственный репозиторий SVN Apache, который, очевидно, огромен. Однако достаточно взглянуть на git.apache.org , и вы заметите, что каждый проект Apache имеет свой собственный репозиторий Git. Что действительно необходимо, так это сравнение сопоставимых; другими словами, проверка проекта (abdera) SVN по сравнению с клоном репозитория (abdera) Git .

Мне удалось проверить git: //git.apache.org/abdera.git . На диске заняло 28,8Мб.
Затем я проверил версию SVN http://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 .

14
ответ дан 27 November 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: