CINXE.COM
Git - Archivos empaquetadores
<!DOCTYPE html> <html lang="es"> <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 - Archivos empaquetadores</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-Packfiles">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-Packfile%e2%80%99lar">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-go-git">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Git-Interna-Packdateien-engl-Packfiles">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Los-entresijos-internos-de-Git-Archivos-empaquetadores">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Les-tripes-de-Git-Fichiers-group%c3%a9s">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-Packfile">日本語</a>,</td></tr> <tr><td><a href="/book/ko/v2/Git%ec%9d%98-%eb%82%b4%eb%b6%80-Packfile">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Git-Binnenwerk-Packfiles">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-Pack-%d1%84%d0%b0%d0%b9%d0%bb%d1%8b">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Notranjost-Gita-Packfiles-datoteke-zmanj%c5%a1anih-podatkov">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Mga-Panloob-ng-GIT-Packfiles">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%a4%d0%b0%d0%b9%d0%bb%d0%b8-%d0%bf%d0%b0%d0%ba%d1%83%d0%bd%d0%ba%d0%b8">Українська</a></td></tr> <tr><td><a href="/book/zh/v2/Git-%e5%86%85%e9%83%a8%e5%8e%9f%e7%90%86-%e5%8c%85%e6%96%87%e4%bb%b6">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/Git-Internals-Bal%c3%ad%c4%8dkov%c3%a9-soubory">Č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-Packfiles">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Mechanizmy-wewn%c4%99trzne-w-Git-Spakowane-pliki-packfiles">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-Pack-%d1%84%d0%b0%d1%98%d0%bb%d0%be%d0%b2%d0%b8">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Git-Internals-Packfiles">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/Git-Internals-Packfiles">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Git-Internals-Packfiles">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/Git-Internals-Packfiles" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Git-Internals-Packfiles">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Git-Internals-Packfiles">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Git-Internals-Packfiles">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Funcionamento-Interno-do-Git-Packfiles">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Internos-do-Git-Packfiles">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Git-Internals-Packfiles">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Dahili-Git-%c3%96geleri-Packfiles">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-es">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/es/v2/Inicio---Sobre-el-Control-de-Versiones-Acerca-del-Control-de-Versiones">Inicio - Sobre el Control de Versiones</a></h2> <ol> <li> 1.1 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Acerca-del-Control-de-Versiones">Acerca del Control de Versiones</a> </li> <li> 1.2 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Una-breve-historia-de-Git">Una breve historia de Git</a> </li> <li> 1.3 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Fundamentos-de-Git">Fundamentos de Git</a> </li> <li> 1.4 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-La-L%c3%adnea-de-Comandos">La Línea de Comandos</a> </li> <li> 1.5 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Instalaci%c3%b3n-de-Git">Instalación de Git</a> </li> <li> 1.6 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Configurando-Git-por-primera-vez">Configurando Git por primera vez</a> </li> <li> 1.7 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-%c2%bfC%c3%b3mo-obtener-ayuda%3F">¿Cómo obtener ayuda?</a> </li> <li> 1.8 <a href="/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Resumen">Resumen</a> </li> </ol> </li> <li class='chapter'> <h2>2. <a href="/book/es/v2/Fundamentos-de-Git-Obteniendo-un-repositorio-Git">Fundamentos de Git</a></h2> <ol> <li> 2.1 <a href="/book/es/v2/Fundamentos-de-Git-Obteniendo-un-repositorio-Git">Obteniendo un repositorio Git</a> </li> <li> 2.2 <a href="/book/es/v2/Fundamentos-de-Git-Guardando-cambios-en-el-Repositorio">Guardando cambios en el Repositorio</a> </li> <li> 2.3 <a href="/book/es/v2/Fundamentos-de-Git-Ver-el-Historial-de-Confirmaciones">Ver el Historial de Confirmaciones</a> </li> <li> 2.4 <a href="/book/es/v2/Fundamentos-de-Git-Deshacer-Cosas">Deshacer Cosas</a> </li> <li> 2.5 <a href="/book/es/v2/Fundamentos-de-Git-Trabajar-con-Remotos">Trabajar con Remotos</a> </li> <li> 2.6 <a href="/book/es/v2/Fundamentos-de-Git-Etiquetado">Etiquetado</a> </li> <li> 2.7 <a href="/book/es/v2/Fundamentos-de-Git-Alias-de-Git">Alias de Git</a> </li> <li> 2.8 <a href="/book/es/v2/Fundamentos-de-Git-Resumen">Resumen</a> </li> </ol> </li> <li class='chapter'> <h2>3. <a href="/book/es/v2/Ramificaciones-en-Git-%c2%bfQu%c3%a9-es-una-rama%3F">Ramificaciones en Git</a></h2> <ol> <li> 3.1 <a href="/book/es/v2/Ramificaciones-en-Git-%c2%bfQu%c3%a9-es-una-rama%3F">¿Qué es una rama?</a> </li> <li> 3.2 <a href="/book/es/v2/Ramificaciones-en-Git-Procedimientos-B%c3%a1sicos-para-Ramificar-y-Fusionar">Procedimientos Básicos para Ramificar y Fusionar</a> </li> <li> 3.3 <a href="/book/es/v2/Ramificaciones-en-Git-Gesti%c3%b3n-de-Ramas">Gestión de Ramas</a> </li> <li> 3.4 <a href="/book/es/v2/Ramificaciones-en-Git-Flujos-de-Trabajo-Ramificados">Flujos de Trabajo Ramificados</a> </li> <li> 3.5 <a href="/book/es/v2/Ramificaciones-en-Git-Ramas-Remotas">Ramas Remotas</a> </li> <li> 3.6 <a href="/book/es/v2/Ramificaciones-en-Git-Reorganizar-el-Trabajo-Realizado">Reorganizar el Trabajo Realizado</a> </li> <li> 3.7 <a href="/book/es/v2/Ramificaciones-en-Git-Recapitulaci%c3%b3n">Recapitulación</a> </li> </ol> </li> <li class='chapter'> <h2>4. <a href="/book/es/v2/Git-en-el-Servidor-Los-Protocolos">Git en el Servidor</a></h2> <ol> <li> 4.1 <a href="/book/es/v2/Git-en-el-Servidor-Los-Protocolos">Los Protocolos</a> </li> <li> 4.2 <a href="/book/es/v2/Git-en-el-Servidor-Configurando-Git-en-un-servidor">Configurando Git en un servidor</a> </li> <li> 4.3 <a href="/book/es/v2/Git-en-el-Servidor-Generando-tu-clave-p%c3%bablica-SSH">Generando tu clave pública SSH</a> </li> <li> 4.4 <a href="/book/es/v2/Git-en-el-Servidor-Configurando-el-servidor">Configurando el servidor</a> </li> <li> 4.5 <a href="/book/es/v2/Git-en-el-Servidor-El-demonio-Git">El demonio Git</a> </li> <li> 4.6 <a href="/book/es/v2/Git-en-el-Servidor-HTTP-Inteligente">HTTP Inteligente</a> </li> <li> 4.7 <a href="/book/es/v2/Git-en-el-Servidor-GitWeb">GitWeb</a> </li> <li> 4.8 <a href="/book/es/v2/Git-en-el-Servidor-GitLab">GitLab</a> </li> <li> 4.9 <a href="/book/es/v2/Git-en-el-Servidor-Git-en-un-alojamiento-externo">Git en un alojamiento externo</a> </li> <li> 4.10 <a href="/book/es/v2/Git-en-el-Servidor-Resumen">Resumen</a> </li> </ol> </li> <li class='chapter'> <h2>5. <a href="/book/es/v2/Git-en-entornos-distribuidos-Flujos-de-trabajo-distribuidos">Git en entornos distribuidos</a></h2> <ol> <li> 5.1 <a href="/book/es/v2/Git-en-entornos-distribuidos-Flujos-de-trabajo-distribuidos">Flujos de trabajo distribuidos</a> </li> <li> 5.2 <a href="/book/es/v2/Git-en-entornos-distribuidos-Contribuyendo-a-un-Proyecto">Contribuyendo a un Proyecto</a> </li> <li> 5.3 <a href="/book/es/v2/Git-en-entornos-distribuidos-Manteniendo-un-proyecto">Manteniendo un proyecto</a> </li> <li> 5.4 <a href="/book/es/v2/Git-en-entornos-distribuidos-Resumen">Resumen</a> </li> </ol> </li> </ol> </div> <div class='column-middle'> <ol class='book-toc'> <li class='chapter'> <h2>6. <a href="/book/es/v2/GitHub-Creaci%c3%b3n-y-configuraci%c3%b3n-de-la-cuenta">GitHub</a></h2> <ol> <li> 6.1 <a href="/book/es/v2/GitHub-Creaci%c3%b3n-y-configuraci%c3%b3n-de-la-cuenta">Creación y configuración de la cuenta</a> </li> <li> 6.2 <a href="/book/es/v2/GitHub-Participando-en-Proyectos">Participando en Proyectos</a> </li> <li> 6.3 <a href="/book/es/v2/GitHub-Mantenimiento-de-un-proyecto">Mantenimiento de un proyecto</a> </li> <li> 6.4 <a href="/book/es/v2/GitHub-Gesti%c3%b3n-de-una-organizaci%c3%b3n">Gestión de una organización</a> </li> <li> 6.5 <a href="/book/es/v2/GitHub-Scripting-en-GitHub">Scripting en GitHub</a> </li> <li> 6.6 <a href="/book/es/v2/GitHub-Resumen">Resumen</a> </li> </ol> </li> <li class='chapter'> <h2>7. <a href="/book/es/v2/Herramientas-de-Git-Revisi%c3%b3n-por-selecci%c3%b3n">Herramientas de Git</a></h2> <ol> <li> 7.1 <a href="/book/es/v2/Herramientas-de-Git-Revisi%c3%b3n-por-selecci%c3%b3n">Revisión por selección</a> </li> <li> 7.2 <a href="/book/es/v2/Herramientas-de-Git-Organizaci%c3%b3n-interactiva">Organización interactiva</a> </li> <li> 7.3 <a href="/book/es/v2/Herramientas-de-Git-Guardado-r%c3%a1pido-y-Limpieza">Guardado rápido y Limpieza</a> </li> <li> 7.4 <a href="/book/es/v2/Herramientas-de-Git-Firmando-tu-trabajo">Firmando tu trabajo</a> </li> <li> 7.5 <a href="/book/es/v2/Herramientas-de-Git-Buscando">Buscando</a> </li> <li> 7.6 <a href="/book/es/v2/Herramientas-de-Git-Reescribiendo-la-Historia">Reescribiendo la Historia</a> </li> <li> 7.7 <a href="/book/es/v2/Herramientas-de-Git-Reiniciar-Desmitificado">Reiniciar Desmitificado</a> </li> <li> 7.8 <a href="/book/es/v2/Herramientas-de-Git-Fusi%c3%b3n-Avanzada">Fusión Avanzada</a> </li> <li> 7.9 <a href="/book/es/v2/Herramientas-de-Git-Rerere">Rerere</a> </li> <li> 7.10 <a href="/book/es/v2/Herramientas-de-Git-Haciendo-debug-con-Git">Haciendo debug con Git</a> </li> <li> 7.11 <a href="/book/es/v2/Herramientas-de-Git-Subm%c3%b3dulos">Submódulos</a> </li> <li> 7.12 <a href="/book/es/v2/Herramientas-de-Git-Agrupaciones">Agrupaciones</a> </li> <li> 7.13 <a href="/book/es/v2/Herramientas-de-Git-Replace">Replace</a> </li> <li> 7.14 <a href="/book/es/v2/Herramientas-de-Git-Almacenamiento-de-credenciales">Almacenamiento de credenciales</a> </li> <li> 7.15 <a href="/book/es/v2/Herramientas-de-Git-Resumen">Resumen</a> </li> </ol> </li> <li class='chapter'> <h2>8. <a href="/book/es/v2/Personalizaci%c3%b3n-de-Git-Configuraci%c3%b3n-de-Git">Personalización de Git</a></h2> <ol> <li> 8.1 <a href="/book/es/v2/Personalizaci%c3%b3n-de-Git-Configuraci%c3%b3n-de-Git">Configuración de Git</a> </li> <li> 8.2 <a href="/book/es/v2/Personalizaci%c3%b3n-de-Git-Git-Attributes">Git Attributes</a> </li> <li> 8.3 <a href="/book/es/v2/Personalizaci%c3%b3n-de-Git-Puntos-de-enganche-en-Git">Puntos de enganche en Git</a> </li> <li> 8.4 <a href="/book/es/v2/Personalizaci%c3%b3n-de-Git-Un-ejemplo-de-implantaci%c3%b3n-de-una-determinada-pol%c3%adtica-en-Git">Un ejemplo de implantación de una determinada política en Git</a> </li> <li> 8.5 <a href="/book/es/v2/Personalizaci%c3%b3n-de-Git-Recapitulaci%c3%b3n">Recapitulación</a> </li> </ol> </li> <li class='chapter'> <h2>9. <a href="/book/es/v2/Git-y-Otros-Sistemas-Git-como-Cliente">Git y Otros Sistemas</a></h2> <ol> <li> 9.1 <a href="/book/es/v2/Git-y-Otros-Sistemas-Git-como-Cliente">Git como Cliente</a> </li> <li> 9.2 <a href="/book/es/v2/Git-y-Otros-Sistemas-Migraci%c3%b3n-a-Git">Migración a Git</a> </li> <li> 9.3 <a href="/book/es/v2/Git-y-Otros-Sistemas-Resumen">Resumen</a> </li> </ol> </li> <li class='chapter'> <h2>10. <a href="/book/es/v2/Los-entresijos-internos-de-Git-Fontaner%c3%ada-y-porcelana">Los entresijos internos de Git</a></h2> <ol> <li> 10.1 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Fontaner%c3%ada-y-porcelana">Fontanería y porcelana</a> </li> <li> 10.2 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Los-objetos-Git">Los objetos Git</a> </li> <li> 10.3 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Referencias-Git">Referencias Git</a> </li> <li> 10.4 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Archivos-empaquetadores" class="active">Archivos empaquetadores</a> </li> <li> 10.5 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Las-especificaciones-para-hacer-referencia-a%e2%80%a6%e2%80%8b-refspec">Las especificaciones para hacer referencia a… (refspec)</a> </li> <li> 10.6 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Protocolos-de-transferencia">Protocolos de transferencia</a> </li> <li> 10.7 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Mantenimiento-y-recuperaci%c3%b3n-de-datos">Mantenimiento y recuperación de datos</a> </li> <li> 10.8 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Variables-de-entorno">Variables de entorno</a> </li> <li> 10.9 <a href="/book/es/v2/Los-entresijos-internos-de-Git-Recapitulaci%c3%b3n">Recapitulación</a> </li> </ol> </li> </ol> </div> <div class='column-right'> <ol class='book-toc'> <li class='chapter'> <h2>A1. <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Interfaces-gr%c3%a1ficas">Apéndice A: Git en otros entornos</a></h2> <ol> <li> A1.1 <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Interfaces-gr%c3%a1ficas">Interfaces gráficas</a> </li> <li> A1.2 <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Git-en-Visual-Studio">Git en Visual Studio</a> </li> <li> A1.3 <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Git-en-Eclipse">Git en Eclipse</a> </li> <li> A1.4 <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Git-con-Bash">Git con Bash</a> </li> <li> A1.5 <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Git-en-Zsh">Git en Zsh</a> </li> <li> A1.6 <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Git-en-Powershell">Git en Powershell</a> </li> <li> A1.7 <a href="/book/es/v2/Ap%c3%a9ndice-A:-Git-en-otros-entornos-Resumen">Resumen</a> </li> </ol> </li> <li class='chapter'> <h2>A2. <a href="/book/es/v2/Ap%c3%a9ndice-B:-Integrando-Git-en-tus-Aplicaciones-Git-mediante-L%c3%adnea-de-Comandos">Apéndice B: Integrando Git en tus Aplicaciones</a></h2> <ol> <li> A2.1 <a href="/book/es/v2/Ap%c3%a9ndice-B:-Integrando-Git-en-tus-Aplicaciones-Git-mediante-L%c3%adnea-de-Comandos">Git mediante Línea de Comandos</a> </li> <li> A2.2 <a href="/book/es/v2/Ap%c3%a9ndice-B:-Integrando-Git-en-tus-Aplicaciones-Libgit2">Libgit2</a> </li> <li> A2.3 <a href="/book/es/v2/Ap%c3%a9ndice-B:-Integrando-Git-en-tus-Aplicaciones-JGit">JGit</a> </li> </ol> </li> <li class='chapter'> <h2>A3. <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Configuraci%c3%b3n">Apéndice C: Comandos de Git</a></h2> <ol> <li> A3.1 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Configuraci%c3%b3n">Configuración</a> </li> <li> A3.2 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Obtener-y-Crear-Proyectos">Obtener y Crear Proyectos</a> </li> <li> A3.3 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Seguimiento-B%c3%a1sico">Seguimiento Básico</a> </li> <li> A3.4 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Ramificar-y-Fusionar">Ramificar y Fusionar</a> </li> <li> A3.5 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Compartir-y-Actualizar-Proyectos">Compartir y Actualizar Proyectos</a> </li> <li> A3.6 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Inspecci%c3%b3n-y-Comparaci%c3%b3n">Inspección y Comparación</a> </li> <li> A3.7 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Depuraci%c3%b3n">Depuración</a> </li> <li> A3.8 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Parcheo">Parcheo</a> </li> <li> A3.9 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Correo-Electr%c3%b3nico">Correo Electrónico</a> </li> <li> A3.10 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Sistemas-Externos">Sistemas Externos</a> </li> <li> A3.11 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Administraci%c3%b3n">Administración</a> </li> <li> A3.12 <a href="/book/es/v2/Ap%c3%a9ndice-C:-Comandos-de-Git-Comandos-de-Fontaner%c3%ada">Comandos de Fontanería</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.4 Los entresijos internos de Git - Archivos empaquetadores</h1> <div> <h2 id="_archivos_empaquetadores">Archivos empaquetadores</h2> <div class="paragraph"> <p>Volviendo a los objetos en la base de datos de tu repositorio Git de pruebas. En este momento, tienes 11 objetos --4 binarios, 3 árboles, 3 confirmaciones de cambios y 1 etiqueta--.</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/95/85191f37f7b0fb9444f35a9bf50de191beadc2 # tag .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>Git comprime todos esos archivos con zlib, por lo que ocupan más bien poco, entre todos suponen solamente 925 bytes. Puedes añadir algún otro archivo de gran contenido al repositorio y verás una interesante funcionalidad de Git. Para demostrarlo, añadiremos el archivo <code>repo.rb</code> de la librería Grit --es un archivo de código fuente de unos 22K--:.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ curl https://raw.githubusercontent.com/mojombo/grit/master/lib/grit/repo.rb > repo.rb $ git add repo.rb $ git commit -m 'added repo.rb' [master 484a592] added repo.rb 3 files changed, 709 insertions(+), 2 deletions(-) delete mode 100644 bak/test.txt create mode 100644 repo.rb rewrite test.txt (100%)</code></pre> </div> </div> <div class="paragraph"> <p>Si hechas un vistazo al árbol resultante, podrás observar el valor SHA-1 del objeto binario correspondiente a dicho archivo repo.rb:</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 fa49b077972391ad58037050f2a75f74e3671e92 new.txt 100644 blob 033b4468fa6b2a9547a70d88d1bbe8bf3f9ed0d5 repo.rb 100644 blob e3f094f522629ae358806b17daf78246c27c007b test.txt</code></pre> </div> </div> <div class="paragraph"> <p>Puedes usar <code>git cat-file</code> para ver como de grande es este objeto:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -s 033b4468fa6b2a9547a70d88d1bbe8bf3f9ed0d5 22044</code></pre> </div> </div> <div class="paragraph"> <p>Ahora, modifica un poco dicho archivo y comprueba lo que sucede:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ echo '# testing' >> repo.rb $ git commit -am 'modified repo a bit' [master 2431da6] modified repo.rb a bit 1 file changed, 1 insertion(+)</code></pre> </div> </div> <div class="paragraph"> <p>Revisando el árbol creado por esta última confirmación de cambios, verás algo interesante:</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 fa49b077972391ad58037050f2a75f74e3671e92 new.txt 100644 blob b042a60ef7dff760008df33cee372b945b6e884e repo.rb 100644 blob e3f094f522629ae358806b17daf78246c27c007b test.txt</code></pre> </div> </div> <div class="paragraph"> <p>El objeto binario es ahora un binario completamente diferente. Aunque solo has añadido una única línea al final de un archivo que ya contenía 400 líneas, Git ha almacenado el resultado como un objeto completamente nuevo.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git cat-file -s b042a60ef7dff760008df33cee372b945b6e884e 22054</code></pre> </div> </div> <div class="paragraph"> <p>Y, así, tienes en tu disco dos objetos de 22 Kbytes prácticamente idénticos. ¿No seria práctico si Git pudiera almacenar uno de ellos completo y luego solo las diferencias del segundo con respecto al primero?</p> </div> <div class="paragraph"> <p>Pues bien, Git lo puede hacer. El formato inicial como Git guarda sus objetos en disco es el formato conocido como "relajado" (loose). Pero, sin embargo, de vez en cuando, Git suele agrupar varios de esos objetos en un único binario denominado archivo "empaquetador", para ahorrar espacio y hacer así más eficiente su almacenamiento. Esto sucede cada vez que tiene demasiados objetos en formato "relajado"; o cuando tu invocas manualmente al comando <code>git gc</code>; o justo antes de enviar cualquier cosa a un servidor remoto. Puedes comprobar el proceso pidiéndole expresamente a Git que empaquete objetos, utilizando el comando <code>git gc</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git gc Counting objects: 18, done. Delta compression using up to 8 threads. Compressing objects: 100% (14/14), done. Writing objects: 100% (18/18), done. Total 18 (delta 3), reused 0 (delta 0)</code></pre> </div> </div> <div class="paragraph"> <p>Tras esto, si miras los objetos presentes en la carpeta, veras que han desaparecido la mayoría de los que había anteriormente y han apareciendo un par de objetos nuevos:</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/bd/9dbf5aae1a3862dd1526723246b20206e5fc37 .git/objects/d6/70460b4b4aece5915caf5c68d12f560a9fe3e4 .git/objects/info/packs .git/objects/pack/pack-978e03944f5c581011e6998cd0e9e30000905586.idx .git/objects/pack/pack-978e03944f5c581011e6998cd0e9e30000905586.pack</code></pre> </div> </div> <div class="paragraph"> <p>Solo han quedado aquellos objetos binarios no referenciados por ninguna confirmación de cambios --en este caso, el ejemplo de "¿que hay de nuevo, viejo?" y el ejemplo de "contenido de pruebas". Porque nunca los has llegado a incluir en ninguna confirmación de cambios, no se han considerado como objetos definitivos y, por tanto, no han sido empaquetados.</p> </div> <div class="paragraph"> <p>Los otros archivos presentes son el nuevo archivo empaquetador y un índice. El archivo empaquetador es un único archivo conteniendo dentro de él todos los objetos sueltos eliminados del sistema de archivo. El índice es un archivo que contiene las posiciones de cada uno de esos objetos dentro del archivo empaquetador, permitiéndonos así buscarlos y extraer rápidamente cualquiera de ellos. Lo que es interesante es el hecho de que, aunque los objetos originales presentes en el disco antes del <code>gc</code> ocupaban unos 22 Kbytes, el nuevo archivo empaquetador apenas ocupa 7 Kbytes. Empaquetando los objetos, has conseguido reducir a ⅔ el uso de disco.</p> </div> <div class="paragraph"> <p>¿Cómo consigue Git esto? Cuando Git empaqueta objetos, va buscando archivos de igual nombre y tamaño similar, almacenando únicamente las diferencias entre una versión de cada archivo y la siguiente. Puedes comprobarlo mirando en el interior del archivo empaquetador. Y, para eso, has de utilizar el comando "de fontanería" <code>git verify-pack</code>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlight"><code class="language-console" data-lang="console">$ git verify-pack -v .git/objects/pack/pack-978e03944f5c581011e6998cd0e9e30000905586.idx 2431da676938450a4d72e260db3bf7b0f587bbc1 commit 223 155 12 69bcdaff5328278ab1c0812ce0e07fa7d26a96d7 commit 214 152 167 80d02664cb23ed55b226516648c7ad5d0a3deb90 commit 214 145 319 43168a18b7613d1281e5560855a83eb8fde3d687 commit 213 146 464 092917823486a802e94d727c820a9024e14a1fc2 commit 214 146 610 702470739ce72005e2edff522fde85d52a65df9b commit 165 118 756 d368d0ac0678cbe6cce505be58126d3526706e54 tag 130 122 874 fe879577cb8cffcdf25441725141e310dd7d239b tree 136 136 996 d8329fc1cc938780ffdd9f94e0d364e0ea74f579 tree 36 46 1132 deef2e1b793907545e50a2ea2ddb5ba6c58c4506 tree 136 136 1178 d982c7cb2c2a972ee391a85da481fc1f9127a01d tree 6 17 1314 1 \ deef2e1b793907545e50a2ea2ddb5ba6c58c4506 3c4e9cd789d88d8d89c1073707c3585e41b0e614 tree 8 19 1331 1 \ deef2e1b793907545e50a2ea2ddb5ba6c58c4506 0155eb4229851634a0f03eb265b69f5a2d56f341 tree 71 76 1350 83baae61804e65cc73a7201a7252750c76066a30 blob 10 19 1426 fa49b077972391ad58037050f2a75f74e3671e92 blob 9 18 1445 b042a60ef7dff760008df33cee372b945b6e884e blob 22054 5799 1463 033b4468fa6b2a9547a70d88d1bbe8bf3f9ed0d5 blob 9 20 7262 1 \ b042a60ef7dff760008df33cee372b945b6e884e 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a blob 10 19 7282 non delta: 15 objects chain length = 1: 3 objects .git/objects/pack/pack-978e03944f5c581011e6998cd0e9e30000905586.pack: ok</code></pre> </div> </div> <div class="paragraph"> <p>Puedes observar que el objeto binario <code>033b4</code>, (correspondiente a la primera versión de tu archivo repo.rb), tiene una referencia al binario <code>b042a</code> (la segunda versión de ese archivo). La tercera columna refleja el tamaño de cada objeto dentro del paquete, observándose que <code>b042a</code> ocupa unos 22 Kbytes; pero <code>033b4</code> solo ocupa 9 bytes. Resulta curioso que se almacene completa la segunda versión del archivo, mientras que la versión original es donde se almacena solo la diferencia --esto se debe a la mayor probabilidad de que vayamos a recuperar rápidamente la versión mas reciente del archivo--.</p> </div> <div class="paragraph"> <p>Lo verdaderamente interesante de todo este proceso es que podemos reempaquetar en cualquier momento. De vez en cuando, Git, en su empeño por optimizar la ocupación de espacio, reempaqueta automáticamente toda la base de datos, pero también tu mismo puedes reempaquetar en cualquier momento, lanzando manualmente el comando <code>git gc</code>.</p> </div> <div id="nav"><a href="/book/es/v2/Los-entresijos-internos-de-Git-Referencias-Git">prev</a> | <a href="/book/es/v2/Los-entresijos-internos-de-Git-Las-especificaciones-para-hacer-referencia-a…-refspec">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>