CINXE.COM
Git - Objetos do Git
<!DOCTYPE html> <html lang="pt-br"> <head> <meta charset='utf-8'> <meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible'> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Git - Objetos do Git</title> <link href="/favicon.ico" rel='shortcut icon' type='image/x-icon'> <link rel="stylesheet" href="/application.min.css"> <script src="/js/modernizr.js"></script> <script src="/js/modernize.js"></script> </head> <body id="documentation"> <div class="inner"> <header> <a href="/"><img src="/images/logo@2x.png" width="110" height="46" alt="Git" /></a> <span id="tagline"></span> <script type="text/javascript"> const taglines = [ "fast-version-control", "everything-is-local", "distributed-even-if-your-workflow-isnt", "local-branching-on-the-cheap", "distributed-is-the-new-centralized" ]; var tagline = taglines[Math.floor(Math.random() * taglines.length)]; document.getElementById('tagline').innerHTML = '--' + tagline; </script> <form id="search" action="/search/results"> <input id="search-text" name="search" placeholder="Type / to search entire site…" autocomplete="off" type="text" /> </form> <div id="search-results"></div> </header> </div> <div class="inner"> <div id="content-wrapper"> <div tabindex="1" class="sidebar-btn"></div> <aside class="sidebar" id="sidebar"> <nav> <ul> <li> <a href="/about">About</a> <ul> </ul> </li> <li> <a href="/doc" class="active">Documentation</a> <ul class="expanded"> <li> <a href="/docs">Reference</a> </li> <li> <a href="/book" class="active">Book</a> </li> <li> <a href="/videos">Videos</a> </li> <li> <a href="/doc/ext">External Links</a> </li> </ul> </li> <li> <a href="/downloads">Downloads</a> <ul > <li> <a href="/downloads/guis">GUI Clients</a> </li> <li> <a href="/downloads/logos">Logos</a> </li> </ul> </li> <li> <a href="/community">Community</a> </li> </ul> <hr class="sidebar"> <p> This book is available in <a href="/book/en/v2/Git-Internals-Git-Objects">English</a>. </p> <p> Full translation available in <table> <tr><td><a href="/book/az/v2/Git%e2%80%99in-Daxili-%c4%b0%c5%9fl%c9%99ri-Git-Obyektl%c9%99ri">azərbaycan dili</a>,</td></tr> <tr><td><a href="/book/bg/v2/%d0%9f%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d0%b5-B:-%d0%92%d0%b3%d1%80%d0%b0%d0%b6%d0%b4%d0%b0%d0%bd%d0%b5-%d0%bd%d0%b0-Git-%d0%b2-%d0%bf%d1%80%d0%b8%d0%bb%d0%be%d0%b6%d0%b5%d0%bd%d0%b8%d1%8f-Libgit2">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Git-Interna-Git-Objekte">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Los-entresijos-internos-de-Git-Los-objetos-Git">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Les-tripes-de-Git-Les-objets-de-Git">Français</a>,</td></tr> <tr><td><a href="/book/gr">Ελληνικά</a>,</td></tr> <tr><td><a href="/book/ja/v2/Git%e3%81%ae%e5%86%85%e5%81%b4-Git%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88">日本語</a>,</td></tr> <tr><td><a href="/book/ko/v2/Git%ec%9d%98-%eb%82%b4%eb%b6%80-Git-%ea%b0%9c%ec%b2%b4">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Git-Binnenwerk-Git-objecten">Nederlands</a>,</td></tr> <tr><td><a href="/book/ru/v2/Git-%d0%b8%d0%b7%d0%bd%d1%83%d1%82%d1%80%d0%b8-%d0%9e%d0%b1%d1%8a%d0%b5%d0%ba%d1%82%d1%8b-Git">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Notranjost-Gita-Objekti-Git">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Mga-Panloob-ng-GIT-Git-Objects">Tagalog</a>,</td></tr> <tr><td><a href="/book/uk/v2/Git-%d0%b7%d1%81%d0%b5%d1%80%d0%b5%d0%b4%d0%b8%d0%bd%d0%b8-%d0%9e%d0%b1%e2%80%99%d1%94%d0%ba%d1%82%d0%b8-Git">Українська</a></td></tr> <tr><td><a href="/book/zh/v2/Git-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86-Git-%e5%af%b9%e8%b1%a1">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/Git-Internals-Git-Objects">Čeština</a>,</td></tr> <tr><td><a href="/book/mk/v2/%d0%92%d0%bd%d0%b0%d1%82%d1%80%d0%b5%d1%88%d0%bd%d0%be%d1%81%d1%82%d0%b0-%d0%bd%d0%b0-Git-Git-Objects">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Mechanizmy-wewn%c4%99trzne-w-Git-Obiekty-Gita">Polski</a>,</td></tr> <tr><td><a href="/book/sr/v2/%d0%93%d0%b8%d1%82-%d0%b8%d0%b7%d0%bd%d1%83%d1%82%d1%80%d0%b0-%d0%93%d0%b8%d1%82-%d0%be%d0%b1%d1%98%d0%b5%d0%ba%d1%82%d0%b8">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Git-Internals-Git-Objects">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/Git-Internals-Git-Objects">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Git-Internals-Git-Objects">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/Git-Internals-Git-Objects" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Git-Internals-Git-Objects">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Git-Internals-Git-Objects">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Git-Internals-Git-Objects">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-Objetos-do-Git">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Internos-do-Git-Git-Objects">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Git-Internals-Git-Objects">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Git-Nesneleri">Türkçe</a>.</td></tr> </table> </p> <hr class="sidebar"/> <p> The source of this book is <a href="https://github.com/progit/progit2-pt-br">hosted on GitHub.</a></br> Patches, suggestions and comments are welcome. </p> </nav> </aside> <div id="content"> <div id="book-chapters"> <a class="dropdown-trigger" id="book-chapters-trigger" data-panel-id="chapters-dropdown" href="#">Chapters ▾</a> <div class='dropdown-panel' id='chapters-dropdown'> <div class='three-column'> <div class="column-left"> <ol class='book-toc'> <li class='chapter'> <h2>1. <a href="/book/pt-br/v2/Come%c3%a7ando-Sobre-Controle-de-Vers%c3%a3o">Começando</a></h2> <ol> <li> 1.1 <a href="/book/pt-br/v2/Come%c3%a7ando-Sobre-Controle-de-Vers%c3%a3o">Sobre Controle de Versão</a> </li> <li> 1.2 <a href="/book/pt-br/v2/Come%c3%a7ando-Uma-Breve-Hist%c3%b3ria-do-Git">Uma Breve História do Git</a> </li> <li> 1.3 <a href="/book/pt-br/v2/Come%c3%a7ando-O-B%c3%a1sico-do-Git">O Básico do Git</a> </li> <li> 1.4 <a href="/book/pt-br/v2/Come%c3%a7ando-A-Linha-de-Comando">A Linha de Comando</a> </li> <li> 1.5 <a href="/book/pt-br/v2/Come%c3%a7ando-Instalando-o-Git">Instalando o Git</a> </li> <li> 1.6 <a href="/book/pt-br/v2/Come%c3%a7ando-Configura%c3%a7%c3%a3o-Inicial-do-Git">Configuração Inicial do Git</a> </li> <li> 1.7 <a href="/book/pt-br/v2/Come%c3%a7ando-Pedindo-Ajuda">Pedindo Ajuda</a> </li> <li> 1.8 <a href="/book/pt-br/v2/Come%c3%a7ando-Sum%c3%a1rio">Sumário</a> </li> </ol> </li> <li class='chapter'> <h2>2. <a href="/book/pt-br/v2/Fundamentos-de-Git-Obtendo-um-Reposit%c3%b3rio-Git">Fundamentos de Git</a></h2> <ol> <li> 2.1 <a href="/book/pt-br/v2/Fundamentos-de-Git-Obtendo-um-Reposit%c3%b3rio-Git">Obtendo um Repositório Git</a> </li> <li> 2.2 <a href="/book/pt-br/v2/Fundamentos-de-Git-Gravando-Altera%c3%a7%c3%b5es-em-Seu-Reposit%c3%b3rio">Gravando Alterações em Seu Repositório</a> </li> <li> 2.3 <a href="/book/pt-br/v2/Fundamentos-de-Git-Vendo-o-hist%c3%b3rico-de-Commits">Vendo o histórico de Commits</a> </li> <li> 2.4 <a href="/book/pt-br/v2/Fundamentos-de-Git-Desfazendo-coisas">Desfazendo coisas</a> </li> <li> 2.5 <a href="/book/pt-br/v2/Fundamentos-de-Git-Trabalhando-de-Forma-Remota">Trabalhando de Forma Remota</a> </li> <li> 2.6 <a href="/book/pt-br/v2/Fundamentos-de-Git-Criando-Tags">Criando Tags</a> </li> <li> 2.7 <a href="/book/pt-br/v2/Fundamentos-de-Git-Apelidos-Git">Apelidos Git</a> </li> <li> 2.8 <a href="/book/pt-br/v2/Fundamentos-de-Git-Sum%c3%a1rio">Sumário</a> </li> </ol> </li> <li class='chapter'> <h2>3. <a href="/book/pt-br/v2/Branches-no-Git-Branches-em-poucas-palavras">Branches no Git</a></h2> <ol> <li> 3.1 <a href="/book/pt-br/v2/Branches-no-Git-Branches-em-poucas-palavras">Branches em poucas palavras</a> </li> <li> 3.2 <a href="/book/pt-br/v2/Branches-no-Git-O-b%c3%a1sico-de-Ramifica%c3%a7%c3%a3o-Branch-e-Mesclagem-Merge">O básico de Ramificação (Branch) e Mesclagem (Merge)</a> </li> <li> 3.3 <a href="/book/pt-br/v2/Branches-no-Git-Gest%c3%a3o-de-Branches">Gestão de Branches</a> </li> <li> 3.4 <a href="/book/pt-br/v2/Branches-no-Git-Fluxo-de-Branches">Fluxo de Branches</a> </li> <li> 3.5 <a href="/book/pt-br/v2/Branches-no-Git-Branches-remotos">Branches remotos</a> </li> <li> 3.6 <a href="/book/pt-br/v2/Branches-no-Git-Rebase">Rebase</a> </li> <li> 3.7 <a href="/book/pt-br/v2/Branches-no-Git-Sum%c3%a1rio">Sumário</a> </li> </ol> </li> <li class='chapter'> <h2>4. <a href="/book/pt-br/v2/Git-no-servidor-Os-Protocolos">Git no servidor</a></h2> <ol> <li> 4.1 <a href="/book/pt-br/v2/Git-no-servidor-Os-Protocolos">Os Protocolos</a> </li> <li> 4.2 <a href="/book/pt-br/v2/Git-no-servidor-Getting-Git-on-a-Server">Getting Git on a Server</a> </li> <li> 4.3 <a href="/book/pt-br/v2/Git-no-servidor-Gerando-Sua-Chave-P%c3%bablica-SSH">Gerando Sua Chave Pública SSH</a> </li> <li> 4.4 <a href="/book/pt-br/v2/Git-no-servidor-Setting-Up-the-Server">Setting Up the Server</a> </li> <li> 4.5 <a href="/book/pt-br/v2/Git-no-servidor-Git-Daemon">Git Daemon</a> </li> <li> 4.6 <a href="/book/pt-br/v2/Git-no-servidor-Smart-HTTP">Smart HTTP</a> </li> <li> 4.7 <a href="/book/pt-br/v2/Git-no-servidor-GitWeb">GitWeb</a> </li> <li> 4.8 <a href="/book/pt-br/v2/Git-no-servidor-GitLab">GitLab</a> </li> <li> 4.9 <a href="/book/pt-br/v2/Git-no-servidor-Third-Party-Hosted-Options">Third Party Hosted Options</a> </li> <li> 4.10 <a href="/book/pt-br/v2/Git-no-servidor-Sum%c3%a1rio">Sumário</a> </li> </ol> </li> <li class='chapter'> <h2>5. <a href="/book/pt-br/v2/Distributed-Git-Fluxos-de-Trabalho-Distribu%c3%addos">Distributed Git</a></h2> <ol> <li> 5.1 <a href="/book/pt-br/v2/Distributed-Git-Fluxos-de-Trabalho-Distribu%c3%addos">Fluxos de Trabalho Distribuídos</a> </li> <li> 5.2 <a href="/book/pt-br/v2/Distributed-Git-Contribuindo-com-um-Projeto">Contribuindo com um Projeto</a> </li> <li> 5.3 <a href="/book/pt-br/v2/Distributed-Git-Maintaining-a-Project">Maintaining a Project</a> </li> <li> 5.4 <a href="/book/pt-br/v2/Distributed-Git-Summary">Summary</a> </li> </ol> </li> </ol> </div> <div class='column-middle'> <ol class='book-toc'> <li class='chapter'> <h2>6. <a href="/book/pt-br/v2/GitHub-Configurando-uma-conta">GitHub</a></h2> <ol> <li> 6.1 <a href="/book/pt-br/v2/GitHub-Configurando-uma-conta">Configurando uma conta</a> </li> <li> 6.2 <a href="/book/pt-br/v2/GitHub-Contribuindo-em-um-projeto">Contribuindo em um projeto</a> </li> <li> 6.3 <a href="/book/pt-br/v2/GitHub-Maintaining-a-Project">Maintaining a Project</a> </li> <li> 6.4 <a href="/book/pt-br/v2/GitHub-Managing-an-organization">Managing an organization</a> </li> <li> 6.5 <a href="/book/pt-br/v2/GitHub-Scripting-GitHub">Scripting GitHub</a> </li> <li> 6.6 <a href="/book/pt-br/v2/GitHub-Summary">Summary</a> </li> </ol> </li> <li class='chapter'> <h2>7. <a href="/book/pt-br/v2/Git-Tools-Revision-Selection">Git Tools</a></h2> <ol> <li> 7.1 <a href="/book/pt-br/v2/Git-Tools-Revision-Selection">Revision Selection</a> </li> <li> 7.2 <a href="/book/pt-br/v2/Git-Tools-Interactive-Staging">Interactive Staging</a> </li> <li> 7.3 <a href="/book/pt-br/v2/Git-Tools-Stashing-and-Cleaning">Stashing and Cleaning</a> </li> <li> 7.4 <a href="/book/pt-br/v2/Git-Tools-Signing-Your-Work">Signing Your Work</a> </li> <li> 7.5 <a href="/book/pt-br/v2/Git-Tools-Searching">Searching</a> </li> <li> 7.6 <a href="/book/pt-br/v2/Git-Tools-Rewriting-History">Rewriting History</a> </li> <li> 7.7 <a href="/book/pt-br/v2/Git-Tools-Reset-Demystified">Reset Demystified</a> </li> <li> 7.8 <a href="/book/pt-br/v2/Git-Tools-Advanced-Merging">Advanced Merging</a> </li> <li> 7.9 <a href="/book/pt-br/v2/Git-Tools-Rerere">Rerere</a> </li> <li> 7.10 <a href="/book/pt-br/v2/Git-Tools-Debugging-with-Git">Debugging with Git</a> </li> <li> 7.11 <a href="/book/pt-br/v2/Git-Tools-Submodules">Submodules</a> </li> <li> 7.12 <a href="/book/pt-br/v2/Git-Tools-Bundling">Bundling</a> </li> <li> 7.13 <a href="/book/pt-br/v2/Git-Tools-Replace">Replace</a> </li> <li> 7.14 <a href="/book/pt-br/v2/Git-Tools-Credential-Storage">Credential Storage</a> </li> <li> 7.15 <a href="/book/pt-br/v2/Git-Tools-Summary">Summary</a> </li> </ol> </li> <li class='chapter'> <h2>8. <a href="/book/pt-br/v2/Customizing-Git-Git-Configuration">Customizing Git</a></h2> <ol> <li> 8.1 <a href="/book/pt-br/v2/Customizing-Git-Git-Configuration">Git Configuration</a> </li> <li> 8.2 <a href="/book/pt-br/v2/Customizing-Git-Git-Attributes">Git Attributes</a> </li> <li> 8.3 <a href="/book/pt-br/v2/Customizing-Git-Git-Hooks">Git Hooks</a> </li> <li> 8.4 <a href="/book/pt-br/v2/Customizing-Git-An-Example-Git-Enforced-Policy">An Example Git-Enforced Policy</a> </li> <li> 8.5 <a href="/book/pt-br/v2/Customizing-Git-Summary">Summary</a> </li> </ol> </li> <li class='chapter'> <h2>9. <a href="/book/pt-br/v2/Git-and-Other-Systems-Git-as-a-Client">Git and Other Systems</a></h2> <ol> <li> 9.1 <a href="/book/pt-br/v2/Git-and-Other-Systems-Git-as-a-Client">Git as a Client</a> </li> <li> 9.2 <a href="/book/pt-br/v2/Git-and-Other-Systems-Migrating-to-Git">Migrating to Git</a> </li> <li> 9.3 <a href="/book/pt-br/v2/Git-and-Other-Systems-Summary">Summary</a> </li> </ol> </li> <li class='chapter'> <h2>10. <a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-Encanamento-e-Porcelana">Funcionamento Interno do Git</a></h2> <ol> <li> 10.1 <a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-Encanamento-e-Porcelana">Encanamento e Porcelana</a> </li> <li> 10.2 <a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-Objetos-do-Git" class="active">Objetos do Git</a> </li> <li> 10.3 <a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-Refer%c3%aancias-do-Git">Referências do Git</a> </li> <li> 10.4 <a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-Packfiles">Packfiles</a> </li> <li> 10.5 <a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-The-Refspec">The Refspec</a> </li> <li> 10.6 <a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-Transfer-Protocols">Transfer Protocols</a> </li> <li> 10.7 <a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-Maintenance-and-Data-Recovery">Maintenance and Data Recovery</a> </li> <li> 10.8 <a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-Vari%c3%a1veis-de-ambiente">Variáveis de ambiente</a> </li> <li> 10.9 <a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-Sum%c3%a1rio">Sumário</a> </li> </ol> </li> </ol> </div> <div class='column-right'> <ol class='book-toc'> <li class='chapter'> <h2>A1. <a href="/book/pt-br/v2/Appendix-A:-Git-em-Outros-Ambientes-Graphical-Interfaces">Appendix A: Git em Outros Ambientes</a></h2> <ol> <li> A1.1 <a href="/book/pt-br/v2/Appendix-A:-Git-em-Outros-Ambientes-Graphical-Interfaces">Graphical Interfaces</a> </li> <li> A1.2 <a href="/book/pt-br/v2/Appendix-A:-Git-em-Outros-Ambientes-Git-in-Visual-Studio">Git in Visual Studio</a> </li> <li> A1.3 <a href="/book/pt-br/v2/Appendix-A:-Git-em-Outros-Ambientes-Git-in-Eclipse">Git in Eclipse</a> </li> <li> A1.4 <a href="/book/pt-br/v2/Appendix-A:-Git-em-Outros-Ambientes-Git-in-Bash">Git in Bash</a> </li> <li> A1.5 <a href="/book/pt-br/v2/Appendix-A:-Git-em-Outros-Ambientes-Git-in-Zsh">Git in Zsh</a> </li> <li> A1.6 <a href="/book/pt-br/v2/Appendix-A:-Git-em-Outros-Ambientes-Git-in-Powershell">Git in Powershell</a> </li> <li> A1.7 <a href="/book/pt-br/v2/Appendix-A:-Git-em-Outros-Ambientes-Resumo">Resumo</a> </li> </ol> </li> <li class='chapter'> <h2>A2. <a href="/book/pt-br/v2/Appendix-B:-Embedding-Git-in-your-Applications-Command-line-Git">Appendix B: Embedding Git in your Applications</a></h2> <ol> <li> A2.1 <a href="/book/pt-br/v2/Appendix-B:-Embedding-Git-in-your-Applications-Command-line-Git">Command-line Git</a> </li> <li> A2.2 <a href="/book/pt-br/v2/Appendix-B:-Embedding-Git-in-your-Applications-Libgit2">Libgit2</a> </li> <li> A2.3 <a href="/book/pt-br/v2/Appendix-B:-Embedding-Git-in-your-Applications-JGit">JGit</a> </li> </ol> </li> <li class='chapter'> <h2>A3. <a href="/book/pt-br/v2/Appendix-C:-Git-Commands-Setup-and-Config">Appendix C: Git Commands</a></h2> <ol> <li> A3.1 <a href="/book/pt-br/v2/Appendix-C:-Git-Commands-Setup-and-Config">Setup and Config</a> </li> <li> A3.2 <a href="/book/pt-br/v2/Appendix-C:-Git-Commands-Getting-and-Creating-Projects">Getting and Creating Projects</a> </li> <li> A3.3 <a href="/book/pt-br/v2/Appendix-C:-Git-Commands-Basic-Snapshotting">Basic Snapshotting</a> </li> <li> A3.4 <a href="/book/pt-br/v2/Appendix-C:-Git-Commands-Branching-and-Merging">Branching and Merging</a> </li> <li> A3.5 <a href="/book/pt-br/v2/Appendix-C:-Git-Commands-Sharing-and-Updating-Projects">Sharing and Updating Projects</a> </li> <li> A3.6 <a href="/book/pt-br/v2/Appendix-C:-Git-Commands-Inspection-and-Comparison">Inspection and Comparison</a> </li> <li> A3.7 <a href="/book/pt-br/v2/Appendix-C:-Git-Commands-Debugging">Debugging</a> </li> <li> A3.8 <a href="/book/pt-br/v2/Appendix-C:-Git-Commands-Patching">Patching</a> </li> <li> A3.9 <a href="/book/pt-br/v2/Appendix-C:-Git-Commands-Email">Email</a> </li> <li> A3.10 <a href="/book/pt-br/v2/Appendix-C:-Git-Commands-External-Systems">External Systems</a> </li> <li> A3.11 <a href="/book/pt-br/v2/Appendix-C:-Git-Commands-Administration">Administration</a> </li> <li> A3.12 <a href="/book/pt-br/v2/Appendix-C:-Git-Commands-Plumbing-Commands">Plumbing Commands</a> </li> </ol> </li> </ol> </div> </div> </div> <span class="light" id="edition"> 2nd Edition </span> </div> <div id="main" data-pagefind-filter="category:book" data-pagefind-meta="category:Book" data-pagefind-weight="0.05" data-pagefind-body class="book edition2"> <h1>10.2 Funcionamento Interno do Git - Objetos do Git</h1> <div> <h2 id="r_objects">Objetos do Git</h2> <div class="paragraph"> <p>O Git é um sistema de arquivos de conteúdo endereçável. Ótimo. O que isso significa? Isso significa que o coração do Git é um simples armazenamento chave-valor. Você pode inserir qualquer tipo de conteúdo nele, e ele lhe dará de volta uma chave que você pode usar para recuperar o conteúdo de volta em qualquer momento. Para demonstrar isso, você pode usar o comando de encanamento <code>hash-object</code>, que recebe alguns dados, armazena eles em seu diretório <code>.git</code>, e lhe devolve de volta a chave com o qual os dados são armazenados. Primeiramente, inicialize um novo repositório Git e verifique que não há nada no diretório <code>objects</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git init test Initialized empty Git repository in /tmp/test/.git/ $ cd test $ find .git/objects .git/objects .git/objects/info .git/objects/pack $ find .git/objects -type f</code></pre> </div> </div> <div class="paragraph"> <p>O Git inicializou o diretório <code>objects</code> diretamente e criou os subdiretórios <code>pack</code> e <code>info</code> dentro dele, mas não há nenhum arquivo regular. Agora, guarde algum texto no seu banco de dados do Git:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo 'test content' | git hash-object -w --stdin d670460b4b4aece5915caf5c68d12f560a9fe3e4</code></pre> </div> </div> <div class="paragraph"> <p>A <em>flag</em>`-w` diz ao <code>hash-object</code> para armazenar o objeto. Caso contrário, o comando simplesmente lhe diria a chave. <code>--stdin</code> diz ao comando para ler o conteúdo do stdin; se você não especificar isto, <code>hash-object</code> espera um caminho para um arquivo no fim. A saída do comando é um <code>checksum hash</code> de 40 caracteres. Esse é o <em>hash</em> SHA-1 - um <code>checksum</code> do conteúdo que você está armazendo mais um cabeçalho, que você aprenderá em breve. Agora você pode ver como o Git armazenou seus dados:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ find .git/objects -type f .git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4</code></pre> </div> </div> <div class="paragraph"> <p>Você pode ver um arquivo no diretório <code>objects</code>. É assim que o Git armazena o conteúdo inicialmente - como um simples arquivo por porção de conteúdo, nomeado com o <em>checksum</em> SHA-1 do conteúdo e seu cabeçalho. O subdiretório é nomeado com os dois primeiros caracteres do SHA-1, e o nome do arquivo são os 38 caracteres restantes.</p> </div> <div class="paragraph"> <p>Você pode recuperar o conteúdo para fora do Git com o comando <code>cat-file</code>. Esse comando é um canivete suíço para a inspeção de objetos do Git. Passando <code>-p</code> para ele faz com que o <code>cat-file</code> descubra o tipo do conteúdo e o mostre gentilmente para você:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4 test content</code></pre> </div> </div> <div class="paragraph"> <p>Agora, você pode adicionar conteúdo para o Git e recuperá-lo de volta. Você também pode fazer isso para conteúdos em arquivos. Por exemplo, você pode fazer um controle de versão simples em um arquivo. Primeiro, crie um arquivo e salve seus conteúdos em seu banco de dados:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo 'version 1' > test.txt $ git hash-object -w test.txt 83baae61804e65cc73a7201a7252750c76066a30</code></pre> </div> </div> <div class="paragraph"> <p>Depois, escreva alguns conteúdos novos nesse arquivo, e salve-o novamente:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo 'version 2' > test.txt $ git hash-object -w test.txt 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a</code></pre> </div> </div> <div class="paragraph"> <p>Seu banco de dados contém as duas novas versões do arquivo, além do primeiro conteúdo que você gravou:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ find .git/objects -type f .git/objects/1f/7a7a472abf3dd9643fd615f6da379c4acb3e3a .git/objects/83/baae61804e65cc73a7201a7252750c76066a30 .git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4</code></pre> </div> </div> <div class="paragraph"> <p>Agora você pode reverter o arquivo de volta à primeira versão:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -p 83baae61804e65cc73a7201a7252750c76066a30 > test.txt $ cat test.txt version 1</code></pre> </div> </div> <div class="paragraph"> <p>ou à segunda versão:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -p 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a > test.txt $ cat test.txt version 2</code></pre> </div> </div> <div class="paragraph"> <p>Lembrando que decorar a chave SHA-1 para cada versão de seu arquivo não é prático; além disso, você não está armazenando o nome do arquivo em seu sitema - apenas o conteúdo. Este tipo de objeto é chamado de <em>blob</em>. Você pode pedir para o Git lhe dizer o tipo de objeto de qualquer objeto, dado sua chave SHA-1, com <code>cat-file -t</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -t 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a blob</code></pre> </div> </div> <div class="sect3"> <h3 id="r_tree_objects">Objetos Tree</h3> <div class="paragraph"> <p>O próximo tipo que iremos ver é a <em>tree</em> (árvore), que resolve o problema de armazenar o nome de arquivo e também permite armazenar de forma conjunta um grupo de arquivos. O Git armazena o conteúdo em uma maneira similar a um sistema de arquivos UNIX, porém um pouco simplificado. Todo o conteúdo é armazenado como objetos <em>tree</em> e <em>blob</em>, com as <em>trees</em> correspondendo a entradas de um diretório UNIX e <em>blobs</em> correspondendo mais ou menos a <em>inodes</em> ou conteúdos de arquivos. Um único objeto <em>tree</em> contém uma ou mais entradas, cada uma contendo uma referência SHA-1 para um <em>blob</em> ou <em>subtree</em> com seu modo, tipo e nome de arquivo associados. Por exemplo, a <em>tree</em> mais recente em um projeto deverá se parecer com algo assim:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -p master^{tree} 100644 blob a906cb2a4a904a152e80877d4088654daad0c859 README 100644 blob 8f94139338f9404f26296befa88755fc2598c289 Rakefile 040000 tree 99f1a6d12cb4b6f19c8655fca46c3ecf317074e0 lib</code></pre> </div> </div> <div class="paragraph"> <p>A sintaxe <code>master^{tree}</code> especifica o objeto <em>tree</em> que é apontado pelo último <em>commit</em> em sua <em>branch</em> <code>master</code> . Note que o subdiretório <code>lib</code> não é um <em>blob</em>, mas uma referência para outra <em>tree</em>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -p 99f1a6d12cb4b6f19c8655fca46c3ecf317074e0 100644 blob 47c6340d6459e05787f644c2447d2595f5d3a54b simplegit.rb</code></pre> </div> </div> <div class="paragraph"> <p>Conceitualmente, os dados que são armazenados pelo Git é algo assim:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/pt-br/v2/images/data-model-1.png" alt="Versão simples do modelo de dados do Git."> </div> <div class="title">Figure 148. Versão simples do modelo de dados do Git.</div> </div> <div class="paragraph"> <p>Você pode criar facilmente a sua própria <em>tree</em>. O Git normalmente cria uma <em>tree</em> a partir do estado da sua área de <em>stage</em> ou <em>index</em> e escrevendo uma série de objetos <em>tree</em> a partir dela. Então, para criar um objeto <em>tree</em>, você primeiro precisa popular um <em>index</em> adicionando alguns arquivos. Para criar um <em>index</em> com apenas uma entrada - a primeira versão do do seu arquivo <code>test.txt</code> - você pode usar o comando <code>update-index</code>. Você usa esse comando para adicionar artificialmente a versão anterior do arquivo <code>test.txt</code> à nova área de <em>stage</em>. Você precisa passar a ele a opção <code>--add</code> porque o arquivo ainda não existe em sua área de <em>stage</em> (você nem precisa ter uma área de <em>stage</em> ainda) e a opção <code>--cacheinfo</code> porque o arquivo que você está adicionando não está em seu diretório mas está no seu banco de dados. Depois você especifica o modo, o SHA-1 e o nome do arquivo:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git update-index --add --cacheinfo 100644 \ 83baae61804e65cc73a7201a7252750c76066a30 test.txt</code></pre> </div> </div> <div class="paragraph"> <p>Neste caso, você está especificando um modo <code>100644</code>, o que significa se trata de um arquivo normal. Outras opções são <code>100755</code>, o que significa que é um arquivo executável; e <code>120000</code>, que especifica um link simbólico. O modo vem dos modos UNIX normais, mas é muito menos flexível - esses três modos são os únicos que são válidos para arquivos (<em>blobs</em>) no Git (ainda que outros modos possam ser usados para diretórios e submódulos).</p> </div> <div class="paragraph"> <p>Agora, você pode usar o comando <code>write-tree</code> para escrever a área de <em>stage</em> para um objeto <em>tree</em>. A opção <code>-w</code> não é necessária - chamar <code>write-tree</code> automaticamente cria um objeto <code>tree</code> a partir do estado do <em>index</em> caso a <em>tree</em> ainda não exista:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git write-tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579 $ git cat-file -p d8329fc1cc938780ffdd9f94e0d364e0ea74f579 100644 blob 83baae61804e65cc73a7201a7252750c76066a30 test.txt</code></pre> </div> </div> <div class="paragraph"> <p>Você também pode verificar que se este é um arquivo <em>tree</em>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -t d8329fc1cc938780ffdd9f94e0d364e0ea74f579 tree</code></pre> </div> </div> <div class="paragraph"> <p>Você pode criar um novo arquivo <em>tree</em> com a segunda versão de <code>test.txt</code>, além de um novo arquivo:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo 'new file' > new.txt $ git update-index --cacheinfo 100644 \ 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a test.txt $ git update-index test.txt $ git update-index --add new.txt</code></pre> </div> </div> <div class="paragraph"> <p>Sua área de <em>stage</em> agora tem a nova versão de <code>test.txt</code>, bem como o novo arquivo <code>new.txt</code>. Escreva essa <em>tree</em> (grave o estado da área de <em>stage</em> ou <em>index</em> para um objeto) e veja como ela se parece:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git write-tree 0155eb4229851634a0f03eb265b69f5a2d56f341 $ git cat-file -p 0155eb4229851634a0f03eb265b69f5a2d56f341 100644 blob fa49b077972391ad58037050f2a75f74e3671e92 new.txt 100644 blob 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a test.txt</code></pre> </div> </div> <div class="paragraph"> <p>Note que essa <em>tree</em> tem ambas as entradas de arquivo além de que o SHA-1 de <code>test.txt</code> é a o SHA-1 da “versão 2” que falamos anteriormente (<code>1f7a7a</code>). Apenas por diversão, adicione a primeira <em>tree</em> como um subdiretório neste aqui. Você pode ler as <em>trees</em> para a área de <em>stage</em> chamando <code>read-tree</code>. Neste caso, você pode ler uma <em>tree</em> existente em sua área de <em>stage</em> como uma <em>subtree</em> usando a opção <code>--prefix</code> em <code>read-tree</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git read-tree --prefix=bak d8329fc1cc938780ffdd9f94e0d364e0ea74f579 $ git write-tree 3c4e9cd789d88d8d89c1073707c3585e41b0e614 $ git cat-file -p 3c4e9cd789d88d8d89c1073707c3585e41b0e614 040000 tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579 bak 100644 blob fa49b077972391ad58037050f2a75f74e3671e92 new.txt 100644 blob 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a test.txt</code></pre> </div> </div> <div class="paragraph"> <p>Se você criasse um diretório de trabalho a partir da nova <em>tree</em> que você criou, você teria os dois arquivos no nível mais alto do diretório de trabalho e um subdiretório chamado <code>bak</code> que conteria a primeira versão do arquivo <code>test.txt</code>. Você pode pensar nos dados que o Git armazena para essas estruturas como sendo algo assim:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/pt-br/v2/images/data-model-2.png" alt="A estrutura atual do conteúdo dos seus dados no Git."> </div> <div class="title">Figure 149. A estrutura atual do conteúdo dos seus dados no Git.</div> </div> </div> <div class="sect3"> <h3 id="r_git_commit_objects">Objetos Commit</h3> <div class="paragraph"> <p>Agora você tem três <em>trees</em> que especificam os diferentes <em>snapshots</em> do seu projeto que você gostaria de rastrear, mas o problema anterior se mantém: você precisa lembrar dos três valores dos SHA-1 para encontrar os <em>snapshots</em> Você também não tem nenhuma informação sobre quem salvou os snapshots, quando eles foram salvos, ou porque eles foram salvos. Essas são informações básicas que o objeto <em>commit</em> armazena para você.</p> </div> <div class="paragraph"> <p>Para criar um objeto <em>commit</em>, você chama <code>commit-tree</code> e especifica o SHA-1 de uma única <em>tree</em> e quais objetos <em>commit</em> precedem diretamente ele, se houver. Começando com a primeira <em>tree</em> que você escreveu:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo 'first commit' | git commit-tree d8329f fdf4fc3344e67ab068f836878b6c4951e3b15f3d</code></pre> </div> </div> <div class="paragraph"> <p>Você irá obter um valor diferente para o <em>hash</em> por causa das diferentes hora de criação e dados do autor. Substitua os <em>hashes</em> de <em>commit</em> e <em>tag</em> pelos seus próprios <em>checksums</em> posteriormente neste capítulo. Agora você pode olhar para o seu novo objeto <em>commit</em> com <code>cat-file</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -p fdf4fc3 tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579 author Scott Chacon <schacon@gmail.com> 1243040974 -0700 committer Scott Chacon <schacon@gmail.com> 1243040974 -0700 first commit</code></pre> </div> </div> <div class="paragraph"> <p>O formato para um objeto <em>commit</em> é simples: ele especifica a <em>tree</em> de nível mais alto para o <em>snapshot</em> do projeto neste ponto; a informação do autor/<em>commiter</em> (que usa as configurações <code>user.name</code> e <code>user.email</code>, além de um <em>timestamp</em>); uma linha em branco e então a mensagem de <em>commit</em>.</p> </div> <div class="paragraph"> <p>A seguir, você irá escrever outros dois objetos <em>commit</em>, cada um referenciando o <em>commit</em> que veio diretamente antes dele:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo 'second commit' | git commit-tree 0155eb -p fdf4fc3 cac0cab538b970a37ea1e769cbbde608743bc96d $ echo 'third commit' | git commit-tree 3c4e9c -p cac0cab 1a410efbd13591db07496601ebc7a059dd55cfe9</code></pre> </div> </div> <div class="paragraph"> <p>Cada um dos três objetos <em>commit</em> aponta para uma das três <em>trees</em> de <em>snapshot</em> que você criou. Curiosamente, você tem agora um histórico do Git real que você pode ver com o comando <code>git log</code>, se você executá-lo no SHA-1 do último <em>commit</em>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git log --stat 1a410e commit 1a410efbd13591db07496601ebc7a059dd55cfe9 Author: Scott Chacon <schacon@gmail.com> Date: Fri May 22 18:15:24 2009 -0700 third commit bak/test.txt | 1 + 1 file changed, 1 insertion(+) commit cac0cab538b970a37ea1e769cbbde608743bc96d Author: Scott Chacon <schacon@gmail.com> Date: Fri May 22 18:14:29 2009 -0700 second commit new.txt | 1 + test.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) commit fdf4fc3344e67ab068f836878b6c4951e3b15f3d Author: Scott Chacon <schacon@gmail.com> Date: Fri May 22 18:09:34 2009 -0700 first commit test.txt | 1 + 1 file changed, 1 insertion(+)</code></pre> </div> </div> <div class="paragraph"> <p>Incrível. Você acabou de fazer operações de baixo nível para criar um histórico do Git sem usar nenhum dos comandos de <em>front-end</em>. Isso é essencialmente o que o Git faz quando você executa os comandos <code>git add</code> e <code>git commit</code> - ele armazena <em>blobs</em> para os arquivos que mudaram, atualiza o <em>index</em>, escreve as <em>trees</em> e escreve os objetos <em>commit</em> que referenciam as <em>trees</em> de mais alto nível e os <em>commits</em> que vieram imediatamente antes deles. Esses três principais objetos do Git - o <em>blob</em>, a <em>tree</em>, e o <em>commit</em> - são inicialmente armazenados como arquivos separados em seu diretório <code>.git/objects</code>. Estes são todos os objetos no diretório de exemplo, comentados com o que eles armazenam:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ find .git/objects -type f .git/objects/01/55eb4229851634a0f03eb265b69f5a2d56f341 # tree 2 .git/objects/1a/410efbd13591db07496601ebc7a059dd55cfe9 # commit 3 .git/objects/1f/7a7a472abf3dd9643fd615f6da379c4acb3e3a # test.txt v2 .git/objects/3c/4e9cd789d88d8d89c1073707c3585e41b0e614 # tree 3 .git/objects/83/baae61804e65cc73a7201a7252750c76066a30 # test.txt v1 .git/objects/ca/c0cab538b970a37ea1e769cbbde608743bc96d # commit 2 .git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4 # 'test content' .git/objects/d8/329fc1cc938780ffdd9f94e0d364e0ea74f579 # tree 1 .git/objects/fa/49b077972391ad58037050f2a75f74e3671e92 # new.txt .git/objects/fd/f4fc3344e67ab068f836878b6c4951e3b15f3d # commit 1</code></pre> </div> </div> <div class="paragraph"> <p>Se você seguir as referências internas, você obterá um grafo de objetos mais ou menos como este:</p> </div> <div class="imageblock"> <div class="content"> <img src="/book/pt-br/v2/images/data-model-3.png" alt="Todos os objetos no seu diretório do Git."> </div> <div class="title">Figure 150. Todos os objetos no seu diretório do Git.</div> </div> </div> <div class="sect3"> <h3 id="_armazenamento_de_objetos">Armazenamento de Objetos</h3> <div class="paragraph"> <p>Mencionamos anteriormente que o cabeçalho é armazenado junto com o conteúdo. Vamos tomar um minuto para olhar como o Git armazena seus objetos. Você verá como armazenar um objeto <em>blob</em> - neste caso, a <em>string</em> “what is up, doc?” - interativamente usando a linguagem de <em>script</em> Ruby.</p> </div> <div class="paragraph"> <p>Você pode iniciar o modo interativo do Ruby com o comando <code>irb</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ irb >> content = "what is up, doc?" => "what is up, doc?"</code></pre> </div> </div> <div class="paragraph"> <p>O Git constrói um cabeçalho que começa com o tipo de objeto, neste caso, um <em>blob</em>. Depois, ele adiciona um espaço seguido do tamanho do conteúdo e finalmente um <em>byte</em> nulo:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">>> header = "blob #{content.length}\0" => "blob 16\u0000"</code></pre> </div> </div> <div class="paragraph"> <p>O Git concatena o cabeçalho e o conteúdo original e então calcula o <em>checksum</em> SHA-1 do novo conteúdo. Você pode calcular o valor SHA-1 de uma <em>string</em> em Ruby incluindo a biblioteca SHA1 digest com o comando <code>require</code> e então chamando <code>Digest::SHA1.hexdigest()</code> com a <em>string</em>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">>> store = header + content => "blob 16\u0000what is up, doc?" >> require 'digest/sha1' => true >> sha1 = Digest::SHA1.hexdigest(store) => "bd9dbf5aae1a3862dd1526723246b20206e5fc37"</code></pre> </div> </div> <div class="paragraph"> <p>O Git comprime o novo conteúdo com zlib, o que você pode fazer em Ruby com a biblioteca zlib. Primeiro, você precisa incluir a biblioteca e então executar <code>Zlib::Deflate.deflate()</code> no conteúdo:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">>> require 'zlib' => true >> zlib_content = Zlib::Deflate.deflate(store) => "x\x9CK\xCA\xC9OR04c(\xCFH,Q\xC8,V(-\xD0QH\xC9O\xB6\a\x00_\x1C\a\x9D"</code></pre> </div> </div> <div class="paragraph"> <p>Por último, você irá salvar o seu conteúdo comprimido com zlib em um objeto no disco. Você irá determinar o caminho do objeto que você quer escrever (sendo os dois primeiros caracteres do valor do SHA-1 o nome do subdiretório, e os últimos 38 caracteres sendo o nome do arquivo dentro desse diretório). Em Ruby, você pode usar a função <code>FileUtils.mkdir_p()</code> para criar o subdiretório se ele não existir. Depois, abra o arquivo com <code>File.open()</code> e escreva o conteúdo previamente comprimido com zlib no arquivo chamando <code>write()</code> no <em>file handle</em> resultante:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">>> path = '.git/objects/' + sha1[0,2] + '/' + sha1[2,38] => ".git/objects/bd/9dbf5aae1a3862dd1526723246b20206e5fc37" >> require 'fileutils' => true >> FileUtils.mkdir_p(File.dirname(path)) => ".git/objects/bd" >> File.open(path, 'w') { |f| f.write zlib_content } => 32</code></pre> </div> </div> <div class="paragraph"> <p>É isso - você criou um objeto <em>blob</em> do Git válido. Todos os objetos são armazenados do mesmo jeito, apenas com diferentes tipos - em vez da <em>string</em> <em>blob</em>, o cabeçalho começará com <em>commit</em> ou <em>tree</em>. Além disso, ainda que o conteúdo do <em>blob</em> possa ser quase qualquer coisa, o conteúdo do <em>commit</em> e da <em>tree</em> são especificamente formatados.</p> </div> </div> <div id="nav"><a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-Encanamento-e-Porcelana">prev</a> | <a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-Referências-do-Git">next</a></div> </div> </div> </div> </div> <footer> <div class="site-source"> <a href="/site">About this site</a><br> Patches, suggestions, and comments are welcome. </div> <div class="sfc-member"> Git is a member of <a href="/sfc">Software Freedom Conservancy</a> </div> </footer> <a href="#top" class="no-js scrollToTop" id="scrollToTop" data-label="Scroll to top"> <img src="/images/icons/chevron-up@2x.png" width="20" height="20" alt="scroll-to-top"/> </a> <script src="/js/jquery-1.7.1.min.js"></script> <script src="/js/jquery-ui-1.8.18.custom.min.js"></script> <script src="/js/jquery.defaultvalue.js"></script> <script src="/js/session.min.js"></script> <script src="/js/application.min.js"></script> </div> </body> </html>