You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<p>После всего вышесказанного вы должны чувствовать себя уверенно, используя Git как клиент для других систем контроля версий или импортируя практически любой существующий репозиторий в Git без потери данных.
24
+
Следующая глава раскроет перед вами внутреннюю механику Git, так что вы будете способны контролировать каждый байт данных, если это потребуется.</p>
### DO NOT EDIT! Generated by script/update-book2.rb
3
+
category: book
4
+
section: documentation
5
+
subsection: book
6
+
sidebar: book
7
+
book:
8
+
language_code: ru
9
+
chapter:
10
+
title: Git изнутри
11
+
number: 10
12
+
section:
13
+
title: Pack-файлы
14
+
number: 4
15
+
cs_number: '10.4'
16
+
previous: book/ru/v2/Git-изнутри-Ссылки-в-Git
17
+
next: book/ru/v2/Git-изнутри-Спецификации-ссылок
18
+
title: Git - Pack-файлы
19
+
url: "/book/ru/v2/Git-изнутри-Pack-файлы.html"
20
+
---
21
+
<h2id="_pack_файлы">Pack-файлы</h2>
22
+
<divclass="paragraph">
23
+
<p>Если вы следовали всем инструкциям из примеров предыдущего раздела, то теперь ваш тестовый репозиторий должен содержать 11 объектов: 4 блоба, 3 дерева, 3 коммита и один тег:</p>
24
+
</div>
25
+
<divclass="listingblock">
26
+
<divclass="content">
27
+
<preclass="highlight"><codeclass="language-console" data-lang="console">$ find .git/objects -type f
28
+
.git/objects/01/55eb4229851634a0f03eb265b69f5a2d56f341 # tree 2
<p>Теперь файлу <code>repo.rb</code> соответствует совершенно другой блоб; это означает, что после добавления всего одной единственной строки в конец 400-строчного файла, Git сохранит новый контент в отдельный объект:</p>
<p>Итак, мы имеем два практически одинаковых объекта, занимающих по 22 Кб на диске (в сжатом виде — приблизительно 7 Кб каждый).
112
+
Было бы здорово, если бы Git сохранял только один объект целиком, а другой как разницу между ним и первым объектом.</p>
113
+
</div>
114
+
<divclass="paragraph">
115
+
<p>Оказывается, Git так и делает.
116
+
Первоначальный формат для сохранения объектов в Git называется «рыхлым» форматом (loose format).
117
+
Однако, время от времени Git упаковывает несколько таких объектов в один pack-файл для сохранения места на диске и повышения эффективности.
118
+
Это происходит, когда «рыхлых» объектов становится слишком много, а также при ручном вызове <code>git gc</code> или отправке изменений на удалённый сервер.
119
+
Чтобы посмотреть, как происходит упаковка, можно выполнить команду <code>git gc</code>:</p>
<p>Оставшиеся объекты — это блобы, на которые не указывает ни один коммит; в нашем случае это созданные ранее объекты, содержащие строки «what is up, doc?» и «test content».
146
+
В силу того, что ни в одном коммите данные файлы не присутствуют, они считаются «висячими» и в pack-файл не включаются.</p>
147
+
</div>
148
+
<divclass="paragraph">
149
+
<p>Остальные файлы — это pack-файл и его индекс.
150
+
Pack-файл — это файл, в котором теперь находится содержимое всех удалённых объектов.
151
+
Индекс — это файл, в котором записаны смещения для быстрого доступа к содержимому прежних объектов.
152
+
Упаковка данных положительно повлияла на общий размер файлов: если до вызова команды <code>gc</code> в сжатом виде они занимали примерно 15 Кб, то pack-файл занимает всего 7 Кб.
153
+
За счёт упаковки объектов мы только что освободили как минимум половину занимаемого дискового пространства!</p>
154
+
</div>
155
+
<divclass="paragraph">
156
+
<p>Как Git это делает?
157
+
При упаковке Git ищет похожие по имени и размеру файлы и сохраняет только разницу между соседними версиями.
158
+
Можно заглянуть в pack-файл чтобы понять, какие действия выполняются при сжатии.
159
+
Для просмотра содержимого упакованного файла существует служебная команда <code>git verify-pack</code>:</p>
<p>Здесь блоб <code>033b4</code>, который, как мы помним, был первой версией файла <code>repo.rb</code>, ссылается на блоб <code>b042a</code>, который хранит вторую его версию.
192
+
Третья колонка в выводе — это размер содержимого объекта в pack-файле; как видите, <code>b042a</code> занимает 22 Кб, а <code>033b4</code> — всего 9 байт.
193
+
Что интересно, вторая версия файла сохраняется «как есть», а первая — в виде дельты: ведь скорее всего вам понадобится быстрый доступ к самым последним версиям файла.</p>
194
+
</div>
195
+
<divclass="paragraph">
196
+
<p>Также здорово, что переупаковку можно выполнять в любое время.
197
+
Время от времени Git будет выполнять её автоматически, чтобы сэкономить место на диске, но всегда можно инициировать упаковку вручную используя <code>git gc</code>.</p>
<p>Теперь вы довольно хорошо понимаете, что Git делает за кулисами и, в некоторой степени, как он устроен.
24
+
В данной главе мы рассмотрели несколько служебных команд — более низкоуровневых и простых, чем обычные пользовательские команды, описанные в остальной части книги.
25
+
Понимание принципов работы Git на более низком уровне поможет вам лучше понять его работу в целом и даст возможность написать собственные утилиты и сценарии для организации специфического процесса работы с Git.</p>
26
+
</div>
27
+
<divclass="paragraph">
28
+
<p>Git как контентно-адресуемая файловая система — очень мощный инструмент, который можно использовать как нечто большее, чем просто систему контроля версий.
29
+
Надеемся, полученное знание внутренней реализации Git поможет вам написать своё крутое приложение, использующее эти технологии, и позволит вам чувствовать себя свободнее с Git даже в продвинутых вещах.</p>
0 commit comments