Chapters ▾ 2nd Edition

10.1 Git Internals (Por Dentro do Git) - Encanamento e Porcelana (Plumbing and Porcelain)

Você pode ter pulado para este capítulo a partir de um capítulo anterior ou pode ter chegado aqui depois de ler todo o livro de forma sequencial até este ponto - em ambos os casos, é aqui onde abordaremos o funcionamento interno e a implementação do Git. Descobrimos que a compreensão dessa informação foi de fundamental importância para apreciar a utilidade e o poder do Git, mas outras pessoas nos argumentaram que ela pode ser confusa e desnecessariamente complexa para iniciantes. Portanto, fizemos desta discussão o último capítulo do livro, para que você possa lê-la mais cedo ou mais tarde, dependendo do seu processo de aprendizagem. Deixamos a seu critério essa decisão.

Agora que você chegou aqui, vamos começar. Primeiro, se ainda não estiver claro, o Git é, fundamentalmente, um sistema de arquivos endereçável por conteúdo (content-addressable filesystem) com uma interface de usuário VCS (sistema de controle de versão) baseada nela. Você aprenderá mais sobre o que isso significa em breve.

No começo do Git (principalmente antes da versão 1.5), a interface do usuário era muito mais complexa, pois enfatizava esse sistema de arquivos em vez de um VCS polido. Nos últimos anos, a interface do usuário (UI) foi refinada até ser tão limpa e fácil de usar quanto qualquer sistema disponível no mercado; contudo, ainda perdura o estereótipo sobre a interface inicial do Git que, naquela época, era complexa e difícil de aprender.

A camada do sistema de arquivos endereçável por conteúdo é incrivelmente interessante, portanto nós a abordaremos primeiro neste capítulo; então, você aprenderá sobre os mecanismos de transporte e as tarefas de manutenção de repositório com as quais possivelmente você terá de lidar com elas.

Encanamento e Porcelana (Plumbing and Porcelain)

Este livro aborda principalmente como usar o Git com cerca de 30 subcomandos, como checkout, branch, remote e assim por diante. No entanto, como o Git foi inicialmente um kit de ferramentas para um sistema de controle de versão, e não um VCS completo e fácil de usar, ele possui vários subcomandos que realizam operações de baixo nível e foram projetados para ser encadeados no estilo UNIX ou chamados a partir de scripts. Esses comandos são geralmente chamados de comandos de “plumbing” do Git, enquanto os comandos mais amigáveis ao usuário são chamados de comandos de “porcelain”.

Como você já deve ter percebido, os nove primeiros capítulos deste livro tratam quase exclusivamente dos comandos de porcelana. Neste capítulo, porém, você lidará principalmente com os comandos de encanamento de nível mais baixo, pois eles dão acesso ao funcionamento interno do Git e ajudam a demonstrar como e por que o Git faz o que faz. Muitos desses comandos não foram feitos para uso manual na linha de comando, mas para servir como blocos de construção de novas ferramentas e scripts personalizados.

Quando você executa git init em um diretório novo ou existente, o Git cria o diretório .git, onde fica quase tudo o que ele armazena e manipula. Se quiser fazer backup ou clone do repositório, copiar esse único diretório para outro local fornecerá praticamente tudo de que você precisa. Basicamente, todo este capítulo trata do que você pode ver nesse diretório. Eis a aparência típica de um diretório .git recém-inicializado:

$ ls -F1
config
description
HEAD
hooks/
info/
objects/
refs/

Dependendo da sua versão do Git, talvez você veja algum conteúdo adicional ali, mas este é um repositório recém-criado com git init — é o que aparece por padrão. O arquivo description é usado apenas pelo programa GitWeb, portanto não se preocupe com ele. O arquivo config contém as opções de configuração específicas do projeto, e o diretório info mantém um arquivo de exclusão global para os padrões ignorados que você não quer registrar em um arquivo .gitignore. O diretório hooks contém os scripts de hook do lado do cliente ou do servidor, discutidos em detalhes em Hooks do Git.

Restam quatro entradas importantes: os arquivos HEAD e index (este ainda não foi criado) e os diretórios objects e refs. Essas são as partes centrais do Git. O diretório objects armazena todo o conteúdo do banco de dados; o diretório refs armazena ponteiros para objetos de commit nesses dados (branches, tags, remotes e outros); o arquivo HEAD aponta para o branch no qual você fez checkout; e o arquivo index é onde o Git armazena as informações da área de preparação. Agora examinaremos cada uma dessas seções em detalhes para entender como o Git funciona.