22. Dentro do Git: diretório .git

Metas

  • Aprender sobre a estrutura do diretório .git

01 O diretório .git

É hora de fazer alguma pesquisa. Começando pelo diretório raíz do projeto...

Execute:

ls -C .git

Resultado:

$ ls -C .git
COMMIT_EDITMSG  MERGE_RR    config      hooks       info        objects     rr-cache
HEAD        ORIG_HEAD   description index       logs        refs

Essa é uma pasta especial onde todas as coisas do git estão. Vamos explorar o diretório.

02 Banco de Dados de Objetos

Execute:

ls -C .git/objects

Resultado:

$ ls -C .git/objects
09  24  28  45  59  6a  77  80  8c  97  af  c4  e7  info
11  27  43  56  69  6b  78  84  91  9c  b5  e4  fa  pack

Você deve ver várias pastas nomeadas com dois caracteres. As duas primeiras letras do hash sha1 do objeto armazenado no git são o nome dos seus diretórios.

03 Investigue os objetos do banco de dados

Execute:

ls -C .git/objects/<dir>

Resultado:

$ ls -C .git/objects/09
6b74c56bfc6b40e754fc0725b8c70b2038b91e  9fb6f9d3a104feb32fcac22354c4d0e8a182c1

Vamos dar uma olhada em uma das pastas nomeadas com dois caracteres. Devem ter arquivos com nomes de 38 caracteres. Esses arquivos contem os objetos armazenados no git. Eles são comprimidos e encriptados, então é impossível ver seu conteúdo diretamente. Vamos dar uma olhada melhor no diretório Git.

04 Arquivo Config

Execute:

cat .git/config

Resultado:

$ cat .git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
[user]
    name = Alexander Shvets
    email = alex@githowto.com

Esse arquivo de configurações é criado para cada projeto individual. Pelo menos nesse projeto, as entradas nesse arquivo vão sobrescrever as entradas no arquivo .gitconfig do seu diretório principal.

05 Branches e tags

Execute:

ls .git/refs
ls .git/refs/heads
ls .git/refs/tags
cat .git/refs/tags/v1

Resultado:

$ ls .git/refs
heads
tags
$ ls .git/refs/heads
master
$ ls .git/refs/tags
v1
v1-beta
$ cat .git/refs/tags/v1
fa3c1411aa09441695a9e645d4371e8d749da1dc

Arquivos no subdiretório de tags devem ser familiares pra você. Cada arquivo corresponde a tag anteriormente criada usando o comando git tag. Seu conteúdo não é nada mais que um ahsh de um commit associado à tag.

A pasta heads é quase idêntica e é usada não para tags, mas para branches. No momento, nós só temos um branch e tudo que você vê nessa pasta é um branch master.

06 Arquivo HEAD

Execute:

cat .git/HEAD

Resultado:

$ cat .git/HEAD
ref: refs/heads/master

Existe uma referência para o branch atual no arquivo HEAD. Nesse momento, ela tem que ser para o branch master.