CINXE.COM
Git - Puntos de enganche en Git
<!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 - Puntos de enganche en 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/Customizing-Git-Git-Hooks">English</a>. </p> <p> Full translation available in <table> <tr><td><a href="/book/az/v2/Git%e2%80%99i-F%c9%99rdil%c9%99%c5%9fdirm%c9%99k-Git-Hook%e2%80%99lar%c4%b1">azərbaycan dili</a>,</td></tr> <tr><td><a href="/book/bg/v2/Git-%d0%bd%d0%b0-%d0%bd%d0%b8%d1%81%d0%ba%d0%be-%d0%bd%d0%b8%d0%b2%d0%be-Git-%d1%80%d0%b5%d1%84%d0%b5%d1%80%d0%b5%d0%bd%d1%86%d0%b8%d0%b8">български език</a>,</td></tr> <tr><td><a href="/book/de/v2/Git-einrichten-Git-Hooks">Deutsch</a>,</td></tr> <tr><td><a href="/book/es/v2/Personalizaci%c3%b3n-de-Git-Puntos-de-enganche-en-Git">Español</a>,</td></tr> <tr><td><a href="/book/fr/v2/Personnalisation-de-Git-Crochets-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%e3%82%ab%e3%82%b9%e3%82%bf%e3%83%9e%e3%82%a4%e3%82%ba-Git-%e3%83%95%e3%83%83%e3%82%af">日本語</a>,</td></tr> <tr><td><a href="/book/ko/v2/Git%eb%a7%9e%ec%b6%a4-Git-Hooks">한국어</a>,</td></tr> <tr><td><a href="/book/nl/v2/Git-aanpassen-Git-Hooks">Nederlands</a>,</td></tr> <tr><td><a href="/book/ru/v2/%d0%9d%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b9%d0%ba%d0%b0-Git-%d0%a5%d1%83%d0%ba%d0%b8-%d0%b2-Git">Русский</a>,</td></tr> <tr><td><a href="/book/sl/v2/Prilagoditev-Gita-Kljuke-Git">Slovenščina</a>,</td></tr> <tr><td><a href="/book/tl/v2/Pag-aangkop-sa-Sariling-Pangangailagan-ng-Git-Mga-Hook-ng-Git">Tagalog</a>,</td></tr> <tr><td><a href="/book/uk/v2/%d0%9d%d0%b0%d0%bb%d0%b0%d1%88%d1%82%d1%83%d0%b2%d0%b0%d0%bd%d0%bd%d1%8f-Git-%d0%93%d0%b0%d0%ba%d0%b8-hooks-Git">Українська</a></td></tr> <tr><td><a href="/book/zh/v2/%e8%87%aa%e5%ae%9a%e4%b9%89-Git-Git-%e9%92%a9%e5%ad%90">简体中文</a>,</td></tr> </table> </p> <p> Partial translations available in <table> <tr><td><a href="/book/cs/v2/Customizing-Git-Git-Hooks">Čeština</a>,</td></tr> <tr><td><a href="/book/mk/v2/%d0%9f%d0%b5%d1%80%d1%81%d0%be%d0%bd%d0%b0%d0%bb%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d1%98%d0%b0-%d0%bd%d0%b0-Git-Git-Hooks">Македонски</a>,</td></tr> <tr><td><a href="/book/pl/v2/Dostosowywanie-Gita-Git-Hooks">Polski</a>,</td></tr> <tr><td><a href="/book/sr/v2/%d0%9f%d1%80%d0%b8%d0%bb%d0%b0%d0%b3%d0%be%d1%92%d0%b0%d0%b2%d0%b0%d1%9a%d0%b5-%d0%bf%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%b0-%d0%93%d0%b8%d1%82-%d0%93%d0%b8%d1%82-%d0%ba%d1%83%d0%ba%d0%b5">Српски</a>,</td></tr> <tr><td><a href="/book/uz/v2/Customizing-Git-Git-Hooks">Ўзбекча</a>,</td></tr> <tr><td><a href="/book/zh-tw/v2/Customizing-Git-Git-Hooks">繁體中文</a>,</td></tr> </table> </p> <p> Translations started for <table> <tr><td><a href="/book/be/v2/Customizing-Git-Git-Hooks">Беларуская</a>,</td></tr> <tr><td><a href="/book/fa/v2/Customizing-Git-Git-Hooks" dir="rtl">فارسی</a>,</td></tr> <tr><td><a href="/book/id/v2/Kostumisasi-Git-Git-Hooks">Indonesian</a>,</td></tr> <tr><td><a href="/book/it/v2/Customizing-Git-Git-Hooks">Italiano</a>,</td></tr> <tr><td><a href="/book/ms/v2/Customizing-Git-Git-Hooks">Bahasa Melayu</a>,</td></tr> <tr><td><a href="/book/pt-br/v2/Customizing-Git-Git-Hooks">Português (Brasil)</a>,</td></tr> <tr><td><a href="/book/pt-pt/v2/Personalizar-o-Git-Git-Hooks">Português (Portugal)</a>,</td></tr> <tr><td><a href="/book/sv/v2/Customizing-Git-Git-Hooks">Svenska</a>,</td></tr> <tr><td><a href="/book/tr/v2/Git%e2%80%99i-%c3%96zelle%c5%9ftirmek-Git-Kancalar%c4%b1-Hooks">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" class="active">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">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>8.3 Personalización de Git - Puntos de enganche en Git</h1> <div> <h2 id="r_git_hooks">Puntos de enganche en Git</h2> <div class="paragraph"> <p> Al igual que en otros sistemas de control de versiones, Git también cuenta con mecanismos para lanzar scripts de usuario cuando suceden ciertas acciones importantes, llamados puntos de enganche (hooks). Hay dos grupos de esos puntos de lanzamiento: los del lado cliente y los del lado servidor. Los puntos de enganche del lado cliente están relacionados con operaciones tales como la confirmación de cambios (commit) o la fusión (merge). Los del lado servidor están relacionados con operaciones tales como la recepción de contenidos enviados (push) a un servidor. Estos puntos de enganche pueden utilizarse para multitud de aplicaciones. Vamos a ver unas pocas de ellas.</p> </div> <div class="sect3"> <h3 id="_instalación_de_un_punto_de_enganche">Instalación de un punto de enganche</h3> <div class="paragraph"> <p>Los puntos de enganche se guardan en la subcarpeta <em>hooks</em> de la carpeta Git. En la mayoría de proyectos, estará en <code>.git/hooks</code>. Por defecto, esta carpeta contiene unos cuantos scripts de ejemplo. Algunos de ellos son útiles por sí mismos; pero su misión principal es la de documentar las variables de entrada para cada script. Todos los ejemplos se han escrito como scripts de shell, con algo de código Perl embebido en ellos. Pero cualquier tipo de script ejecutable que tenga el nombre adecuado puede servir igual de bien. Los puedes escribir en Ruby o en Python o en cualquier lenguaje de scripting con el que trabajes. Si quieres usar los ejemplos que trae Git, tendrás que renombrarlos, ya que los ejemplos acaban su nombre en <code>.sample</code>.</p> </div> <div class="paragraph"> <p>Para activar un punto de enganche para un script, pon el archivo correspondiente en la carpeta <code>hooks</code>; con el nombre adecuado y con la marca de ejecutable. A partir de ese momento, será automáticamente lanzado cuando se dé la acción correspondiente. Vamos a ver la mayoría de nombres de puntos de enganche disponibles.</p> </div> </div> <div class="sect3"> <h3 id="_puntos_de_enganche_del_lado_cliente">Puntos de enganche del lado cliente</h3> <div class="paragraph"> <p>Hay muchos de ellos. En esta sección los dividiremos en puntos de enganche en el flujo de trabajo de confirmación de cambios, puntos en el flujo de trabajo de correo electrónico y todos los demás.</p> </div> <div class="admonitionblock note"> <table> <tr> <td class="icon"> <div class="title">Nota</div> </td> <td class="content"> <div class="paragraph"> <p>Observa que los puntos de enganche del lado del cliente <strong>no se copian</strong> cuando clonas el repositorio. Si quieres que tengan un efecto para forzar una política específica es necesario que esté en el lado del cliente. Por ejemplo, mira en <a href="/book/es/v2/ch00/r_an_example_git_enforced_policy">Un ejemplo de implantación de una determinada política en Git</a>.</p> </div> </td> </tr> </table> </div> <div class="sect4"> <h4 id="_puntos_en_el_flujo_de_trabajo_de_confirmación_de_cambios">Puntos en el flujo de trabajo de confirmación de cambios</h4> <div class="paragraph"> <p>Los primeros cuatro puntos de enganche están relacionados con el proceso de confirmación de cambios.</p> </div> <div class="paragraph"> <p>Primero se activa el punto de enganche <code>pre-commit</code>, incluso antes de que teclees el mensaje de confirmación. Se suele utilizar para inspeccionar la instantánea (snapshot) que vas a confirmar, para ver si has olvidado algo, para asegurar que las pruebas se ejecutan, o para revisar cualquier aspecto que necesites inspeccionar en el código. Saliendo con un valor de retorno distinto de cero, se aborta la confirmación de cambios. Aunque siempre puedes saltártelo con la orden <code>git commit --no-verify</code>. Puede ser útil para realizar tareas tales como revisar el estilo del código (lanzando <code>lint</code> o algo equivalente), revisar los espacios en blanco de relleno (el script de ejemplo hace exactamente eso), o revisar si todos los nuevos métodos llevan la adecuada documentación.</p> </div> <div class="paragraph"> <p>El punto de enganche <code>prepare-commit-msg</code> se activa antes de arrancar el editor del mensaje de confirmación de cambios, pero después de crearse el mensaje por defecto. Te permite editar el mensaje por defecto, antes de que lo vea el autor de la confirmación de cambios. Este punto de enganche recibe varias entradas: la ubicación (path) del archivo temporal donde se almacena el mensaje de confirmación, el tipo de confirmación y la clave SHA-1 si estamos enmendando un <code>commit</code> existente. Este punto de enganche no tiene mucha utilidad para las confirmaciones de cambios normales; pero sí para las confirmaciones donde el mensaje por defecto es autogenerado, como en las confirmaciones de fusiones (merge), los mensajes con plantilla, las confirmaciones aplastadas (squash), o las confirmaciones de corrección (amend). Se puede utilizar combinándolo con una plantilla de confirmación, para poder insertar información automáticamente.</p> </div> <div class="paragraph"> <p>El punto de enganche <code>commit-msg</code> recibe un parámetro: la ubicación (path) del archivo temporal que contiene el mensaje de confirmación actual. Si este script termina con un código de salida distinto de cero, Git aborta el proceso de confirmación de cambios; permitiendo así validar el estado del proyecto o el mensaje de confirmación antes de permitir continuar. En la última parte de este capítulo, veremos cómo podemos utilizar este punto de enganche para revisar si el mensaje de confirmación es conforme a un determinado patrón obligatorio.</p> </div> <div class="paragraph"> <p>Después de completar todo el proceso de confirmación de cambios, es cuando se lanza el punto de enganche <code>post-commit</code>. Este no recibe ningún parámetro, pero podemos obtener fácilmente la última confirmación de cambios con el comando <code>git log -1 HEAD</code>. Habitualmente, este script final se suele utilizar para realizar notificaciones o tareas similares.</p> </div> </div> <div class="sect4"> <h4 id="r_email_hooks">Puntos en el flujo de trabajo del correo electrónico</h4> <div class="paragraph"> <p>Tienes disponibles tres puntos de enganche en el lado cliente para interactuar con el flujo de trabajo de correo electrónico. Todos ellos se invocan al utilizar el comando <code>git am</code>, por lo que si no utilizas dicho comando, puedes saltar directamente a la siguiente sección. Si recibes parches a través de correo electrónico preparados con <code>git format-patch</code>, es posible que parte de lo descrito en esta sección te pueda ser útil.</p> </div> <div class="paragraph"> <p>El primer punto de enganche que se activa es <code>applypatch-msg</code>. Recibe un solo argumento: el nombre del archivo temporal que contiene el mensaje de confirmación propuesto. Git abortará la aplicación del parche si este script termina con un código de salida distinto de cero. Puedes utilizarlo para asegurarte de que el mensaje de confirmación esté correctamente formateado o para normalizar el mensaje permitiendo al script que lo edite sobre la marcha.</p> </div> <div class="paragraph"> <p>El siguiente punto de enganche que se activa al aplicar parches con <code>git am</code> es el punto <code>pre-applypatch</code>. No recibe ningún argumento de entrada y se lanza después de que el parche haya sido aplicado, por lo que puedes utilizarlo para revisar la situación (snapshot) antes de confirmarla. Con este script puedes, lanzar pruebas o similares para chequear el árbol de trabajo. Si falta algo o si alguna de las pruebas falla, saliendo con un código de salida distinto de cero, abortará el comando <code>git am</code> sin confirmar el parche.</p> </div> <div class="paragraph"> <p>El último punto de enganche que se activa durante una operación <code>git am</code> es el punto <code>post-applypatch</code>. Puedes utilizarlo para notificar de su aplicación al grupo o al autor del parche. No puedes detener el proceso de parcheo con este script.</p> </div> </div> <div class="sect4"> <h4 id="r_other_client_hooks">Otros puntos de enganche del lado cliente</h4> <div class="paragraph"> <p>El punto <code>pre-rebase</code> se activa antes de cualquier reorganización y puede abortarla si retorna con un código de salida distinto de cero. Puedes usarlo para impedir reorganizaciones de cualquier confirmación de cambios ya enviada (push) a algún servidor. El script de ejemplo para <code>pre-rebase</code> hace precisamente eso, aunque asumiendo que <code>next</code> es el nombre de la rama publicada. Si lo vas a utilizar, tendrás que modificarlo para que se ajuste al nombre que tenga tu rama publicada.</p> </div> <div class="paragraph"> <p>El punto de enganche <code>post-rewrite</code> se ejecuta con los comandos que reemplazan confirmaciones de cambio, como <code>git commit --amend</code> y <code>git rebase</code> (pero no con <code>git filter-branch</code>). Su único argumento es el comando que disparará la reescritura, y recibe una lista de reescrituras por la entrada estándar (<code>stdin</code>). Este enganche tiene muchos usos similares a los puntos <code>post-checkout</code> y <code>post-merge</code>.</p> </div> <div class="paragraph"> <p>Tras completarse la ejecución de un comando <code>git checkout</code>, es cuando se activa el punto de enganche <code>post-checkout</code>. Lo puedes utilizar para ajustar tu carpeta de trabajo al entorno de tu proyecto. Entre otras cosas, puedes mover grandes archivos binarios de los que no quieras llevar control, puedes autogenerar documentación, y otras cosas.</p> </div> <div class="paragraph"> <p>El punto de enganche <code>post-merge</code> se activa tras completarse la ejecución de un comando <code>git merge</code>. Puedes utilizarlo para recuperar datos de tu carpeta de trabajo que Git no puede controlar como, por ejemplo, datos relativos a permisos. Este punto de enganche puede utilizarse también para comprobar la presencia de ciertos archivos, externos al control de Git, que desees copiar cada vez que cambie la carpeta de trabajo.</p> </div> <div class="paragraph"> <p>El punto <code>pre-push</code> se ejecuta durante un <code>git push</code>, justo cuando las referencias remotas se han actualizado, pero antes de que los objetos se transfieran. Recibe como parámetros el nombre y la localización del remoto, y una lista de referencias para ser actualizadas, a través de la entrada estándar (<code>stdin</code>). Puedes utilizarlo para validar un conjunto de actualizaciones de referencias antes de que la operación de <code>push</code> tenga lugar (ya que si el script retorna un valor distinto de cero, se abortará la operación).</p> </div> <div class="paragraph"> <p>En ocasiones, Git realizará una recolección de basura como parte de su funcionamiento habitual, llamando a <code>git gc --auto</code>. El punto de enganche <code>pre-auto-gc</code> es el que se llama justo antes de realizar dicha recolección de basura, y puede utilizarse para notificarte que tiene lugar dicha operación, o para poderla abortar si se considera que no es un buen momento.</p> </div> </div> </div> <div class="sect3"> <h3 id="_puntos_de_enganche_del_lado_servidor">Puntos de enganche del lado servidor</h3> <div class="paragraph"> <p>Aparte de los puntos del lado cliente, como administrador de sistemas, puedes utilizar un par de puntos de enganche importantes en el lado servidor; para implementar prácticamente cualquier tipo de política que quieras mantener en tu proyecto. Estos scripts se lanzan antes y después de cada envío (push) al servidor. El script previo, puede terminar con un código de salida distinto de cero y abortar el envío, devolviendo el correspondiente mensaje de error al cliente. Este script puede implementar políticas de recepción tan complejas como desees.</p> </div> <div class="sect4"> <h4 id="_pre_receive"><code>pre-receive</code></h4> <div class="paragraph"> <p>El primer script que se activa al manejar un envío de un cliente es el correspondiente al punto de enganche <code>pre-receive</code>. Recibe una lista de referencias que se están enviando (push) desde la entrada estándar (<code>stdin</code>); y, si termina con un código de salida distinto de cero, ninguna de ellas será aceptada. Puedes utilizar este punto de enganche para realizar tareas tales como la de comprobar que ninguna de las referencias actualizadas son de avance directo (non-fast-forward); o para comprobar que el usuario que realiza el envío tiene realmente permisos para crear, borrar o modificar cualquiera de los archivos que está tratando de cambiar.</p> </div> </div> <div class="sect4"> <h4 id="_update"><code>update</code></h4> <div class="paragraph"> <p>El punto de enganche <code>update</code> es muy similar a <code>pre-receive</code>, pero con la diferencia de que se activa una vez por cada rama que se está intentando actualizar con el envío. Si la persona que realiza el envío intenta actualizar varias ramas, <code>pre-receive</code> se ejecuta una sola vez, mientras que <code>update</code> se ejecuta tantas veces como ramas se estén actualizando. En lugar de recibir datos desde la entrada estándar (<code>stdin</code>), este script recibe tres argumentos: el nombre de la rama, la clave SHA-1 a la que esta apuntada antes del envío, y la clave SHA-1 que el usuario está intentando enviar. Si el script <code>update</code> termina con un código de salida distinto de cero, únicamente los cambios de esa rama son rechazados; el resto de ramas continuarán con sus actualizaciones.</p> </div> </div> <div class="sect4"> <h4 id="_post_receive"><code>post-receive</code></h4> <div class="paragraph"> <p>El punto de enganche <code>post-receive</code> se activa cuando termina todo el proceso, y se puede utilizar para actualizar otros servicios o para enviar notificaciones a otros usuarios. Recibe los mismos datos que <code>pre-receive</code> desde la entrada estándar (<code>stdin</code>). Algunos ejemplos de posibles aplicaciones pueden ser la de alimentar una lista de correo electrónico, avisar a un servidor de integración continua, o actualizar un sistema de seguimiento de tickets de servicio (pudiendo incluso procesar el mensaje de confirmación para ver si hemos de abrir, modificar o dar por cerrado algún ticket). Este script no puede detener el proceso de envío, pero el cliente no se desconecta hasta que no se completa su ejecución; por tanto, has de ser cuidadoso cuando intentes realizar con él tareas que puedan requerir mucho tiempo.</p> </div> </div> </div> <div id="nav"><a href="/book/es/v2/Personalización-de-Git-Git-Attributes">prev</a> | <a href="/book/es/v2/Personalización-de-Git-Un-ejemplo-de-implantación-de-una-determinada-política-en-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>