Объекты типа blob(Binary Large Object) - это основа репозитория. Это маленькие безымянные герои. Безымянные в прямом смысле - это просто содержимое, без имени. Если вы добавляете в git файл tutorial.txt с содержимым "Hello, world!", то это результирующий blob-объект будет содержать строчку "Hello, world!" и ни слова о tutorial.txt. Это очень похоже на иноды (inodes), используемые в файловых системах, если вы понимаете о чем я.
Новый blob-объект создается из содержимого файла с помощью команды git-hash-object.
Если вызывать ее без параметров, только с именем файла - то она выведет SHA1 хеш blob-объекта, который будет создан из этого файла. Если же вызвать ее с параметром -w, то соответствующий blob-объект будет записан в базу под именем, соответствующим этому хешу.
Если объект с таким именем уже существует в базе - то он не будет перезаписан. Вспомните, что имя является "отпечатком пальца" объекта, достаточно уникальным. Значит, если у двух объектов одинаковые имена, то у них одинаковые содержимые. Поэтому git не будет перезаписывать blob.
Например, если в гит положить десять абсолютно одинаковых файлов весом 6 мегабайт, то реально в базе будет занято только 6 мегабайт, а не 60. Это из-за того что blob-объекты не содержат никакой информации об именах файлов, из которых они сделаны, поэтому они идентичны.
Вот пример создания blob-объекта:
$ mkdir ~/tmp/gitguts
$ cd ~/tmp/gitguts
$ git-init
Initialized empty Git repository in .git/
$ echo "Hello, World\!" > tutorial.txt
$ git-hash-object -w tutorial.txt
8ab686eafeb1f44702738c8b0f24f2567c36da6d
$ find .git/objects -type f
.git/objects/8a/b686eafeb1f44702738c8b0f24f2567c36da6d
Как видно, вызов git-hash-object с параметром -w действительно создал и сохранил в базе новый объект типа blob, содержащий строчку "Hello, world!"
Посмотреть, что внутри объекта-blob можно с помощью команды git-cat-file
$ git-cat-file blob 8ab686eafeb1f44702738c8b0f24f2567c36da6d
Hello, World!
Этот новосозданный объект пролежит в базе до тех пор, пока не будет вызван "уборщик мусора" (git-prune или git-gc --prune). Этот трудяга проверяет "прописку" всех объектов, и если на объект не имеется никаких ссылок, то он удаляется из базы. На этот объект мы еще не сделали никаких ссылок, так что при сборке мусора он просто исчезает из базы.
$ git-prune
$ find .git/objects -type f
.git/objects/info/packs
Сами объекты-blob не могут иметь никаких ссылок. Вместо этого, на них ссылается другой объект - дерево(tree).
Комментариев нет:
Отправить комментарий