Ответ 1
Я предполагаю, что вы спрашиваете, как возможно, чтобы клон git (полный репозиторий + checkout) был меньше, чем извлеченные источники в Subversion. Или вы имели в виду что-то еще?
Этот вопрос отвечает в комментариях
Размер репозитория
Сначала вы должны принять во внимание, что после проверки (рабочая версия) Subversion хранит чистую копию (последняя версия) в тех подкаталогах .svn
. Принудительная копия хранится несжатым в Subversion.
Во-вторых, git использует следующие методы, чтобы сделать репозиторий меньшим:
- каждая версия файла сохраняется только один раз; это означает, что если у вас есть только две разные версии некоторого файла в 10 версиях (10 коммитов), git хранит только эти две версии, а не 10.
- объекты (и дельта, см. ниже) хранятся сжатыми; текстовые файлы, используемые в программировании, очень хорошо сжимаются (около 60% от исходного размера или 40% уменьшения размера от сжатия).
- после переупаковки объекты хранятся в дефинированной форме, в отличие от другой версии; дополнительно git пытается упорядочить дельта-цепи таким образом, что дельта состоит в основном из делеций (в обычном случае растущих файлов она находится в порядке повторения); Дельта IIRC также сжимаются.
Производительность (скорость работы)
Во-первых, любая операция, которая связана с сетью, будет намного медленнее локальной операции. Поэтому, например, сравнение текущего состояния рабочей области с какой-либо другой версией или получение журнала (истории), который в Subversion включает в себя сетевое подключение и сетевую передачу, а в git - локальная операция, конечно, будет намного медленнее в Subversion, чем в Git. КСТАТИ. это разница между системами управления версиями централизованного (с использованием клиент-серверного рабочего процесса) и распределенных систем управления версиями (с использованием однорангового рабочего процесса), причем не только между Subversion и Git.
Во-вторых, если я правильно понимаю, в настоящее время ограничение - это не процессор, а IO (доступ к диску). Поэтому возможно, что выигрыш от необходимости считывать меньше данных с диска из-за сжатия (и иметь возможность копировать его в память) преодолевает потерю от необходимости декомпрессии данных.
В-третьих, git был разработан с учетом производительности (см., например, GitHistory на git Wiki):
- В индексе хранится информация о статистике для файлов, а git использует его для определения без проверки файлов, если файлы были изменены или нет (см., например,
core.trustctime
config). - Максимальная глубина дельты ограничена
pack.depth
, которая по умолчанию равна 50. git имеет дельта-кеш для ускорения доступа. Существует файл (сгенерированный) packfile для быстрого доступа к объектам в файле pack. - Git заботится о том, чтобы не прикасаться к файлам, которые ему не нужны. Например, при переключении ветвей или перемотке на другую версию, git обновляет только те файлы, которые были изменены. Следствием этой философии является то, что git поддерживает только очень минимальное расширение ключевого слова (по крайней мере, из коробки).
- Git использует собственная версия LibXDiff, в настоящее время также для diff и merge, вместо вызова внешнего инструмента diff/external merge.
- Git пытается минимизировать латентность, что означает хорошую воспринимаемую производительность. Например, он выводит первую страницу "
git log
" как можно быстрее, и вы видите ее почти сразу, даже если генерация полной истории займет больше времени; он не дожидается полной генерации истории перед ее отображением. - При извлечении новых изменений git проверяет, какие объекты у вас общие с сервером, и отправляет только (сжатые) различия в виде тонкого пакетного файла. По общему признанию, Subversion может (или, возможно, по умолчанию она) также отправлять только различия при обновлении.
Я не хакер git, и я, вероятно, пропустил некоторые приемы и трюки, которые git использует для лучшей производительности. Однако обратите внимание, что git сильно использует POSIX (например, файлы с отображением памяти), поэтому усиление может быть не таким большим в MS Windows.