Почему Git хранит файл в хранилище, когда я просто добавляю его в область подготовки?
Из того, что я понимаю, когда ты git add
файл, он просто размещает файл перед его добавлением в репозиторий, но почему я могу увидеть, что он был добавлен в репозиторий g it, прежде чем я его зафиксировал?
Например, если я создаю новый репозиторий g it и создаю новый файл с именем foo
и добавьте в него содержимое "Hello World", а затем git add foo
Я вижу новый предмет в objects
подкаталог внутри .git
папка. Я даже могу просмотреть содержимое нового файла внутри objects
файл с git cat-file -p
команда.
Что именно было добавлено в .git/objects
папка? Что технически делает подготовка файла? Например, какие шаги предпринимаются после git add
запускается на файл? Может быть, я пойму это лучше, если буду знать шаги.
2 ответа
Зона подготовки является частью хранилища.
Я думаю, что вы путаете объектную базу данных хранилища с историей. Только коммиты являются частью истории, но все объекты Git-дескрипторы являются частью базы данных объектов.
Подумайте об этом: Git не остается в памяти, поэтому где еще он будет записывать, что является частью промежуточной области, чем в его объектной базе данных?
Я даже могу просмотреть содержимое нового файла внутри файла объектов с помощью команды git cat-file -p.
Или же git diff --cached
,
Что именно было добавлено в
.git/objects
папка?
Смотрите " Git Internals - Git Objects "
Вы можете увидеть файл в каталоге объектов. Так Git изначально сохраняет контент - в виде одного файла на единицу контента, названного с помощью контрольной суммы SHA-1 контента и его заголовка. Подкаталог именуется первыми 2 символами SHA-1, а имя файла - оставшимися 38 символами.
почему я могу увидеть, что он был добавлен в репозиторий git до того, как я его зафиксировал?
Не забывай это с git add -p
(--patch
) вы можете добавить части (фрагменты) файла перед фиксацией.
Цель индекса остается (в контексте git add) подготовить следующий коммит.
Он отражает первоначальную потребность в Git, созданную Линусом Торвальдсом в 2005 году, для интеграции патчей (сначала это был просто менеджер слияний)
какие шаги выполняются после запуска git add для файла
В то время как индекс не содержит содержимого файла, объект.objects делает это с незакрепленным (неупакованным) объектом:
См. Хранение объектов для шагов
- Git создает заголовок, который начинается с типа объекта, в данном случае BLOB-объекта. Затем он добавляет пробел, за которым следует размер содержимого и, наконец, нулевой байт.
- Git объединяет заголовок и исходное содержимое, а затем вычисляет контрольную сумму SHA-1 для этого нового содержимого.
- Git сжимает новый контент с помощью zlib,
- Наконец, Git записывает содержимое zlib-deflated в объект на диске. Git определяет путь к объекту, который вы хотите записать (первые два символа значения SHA-1 - это имя подкаталога, а последние 38 символов - это имя файла в этом каталоге)