Логически git сохраняет каждый файл (фактически, каждый объект) в хранилище отдельно и идентифицирует их по SHA1.Вы можете посмотреть на это сами, объекты находятся в каталогах в .git/objects
, которые идентифицируются первыми двумя символами SHA1.
Но git также поддерживает хранение (и передачу) объектов в так называемом packfile.Этот файл содержит объекты, сжатые с использованием zlib.Но он также может содержать дельта-сжатые объекты, ссылающиеся на другой объект в том же файле пакета (это не обязательно должна быть предыдущая версия того же файла).
Объекты, сохраненные как обычные файлы, сжимаются в файл пакетакогда вы звоните git gc
.Это также происходит автоматически во время некоторых операций git, которые могут создавать эти «незакрепленные объекты».
Из-за всего этого рабочий каталог git часто меньше рабочего каталога SVN.Что здорово, учитывая, что git working dir содержит всю историю репо.(Рабочий каталог SVN обычно примерно в два раза больше, чем файлы в нем. Это потому, что он содержит еще одну копию каждого файла для передачи и фиксации.)