{"id":64686,"date":"2023-12-07T07:16:34","date_gmt":"2023-12-07T10:16:34","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=64686&#038;preview=true&#038;preview_id=64686"},"modified":"2023-12-12T10:57:37","modified_gmt":"2023-12-12T13:57:37","slug":"git-hooks","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/","title":{"rendered":"Dominando os Git Hooks: T\u00e9cnicas Avan\u00e7adas e Pr\u00e1ticas Recomendadas"},"content":{"rendered":"<p>O Git pode parecer complexo, mas algumas de suas funcionalidades, como os Git hooks, exigem um entendimento mais aprofundado. Os Git hooks s\u00e3o scripts que o Git executa automaticamente em resposta a eventos espec\u00edficos.<\/p>\n<p>Embora possam ser simples, voc\u00ea tem muito mais espa\u00e7o para us\u00e1-los de forma eficaz. No entanto, para fazer isso, voc\u00ea deve entender todas as engrenagens que comp\u00f5em a roda inteira.<\/p>\n<p>Neste artigo, veremos t\u00e9cnicas avan\u00e7adas de Git hooks que incluem alguns fundamentos, como cri\u00e1-los e instal\u00e1-los, e mais.<\/p>\n<p>Ao longo do texto vamos explicar par\u00e2metros dos hooks e vari\u00e1veis de ambiente, oferecer algumas dicas e truques, analisar m\u00e9todos de solu\u00e7\u00e3o de problemas, e muitos outros t\u00f3picos.<br \/>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc><\/p>\n<h2>Fundamentos dos Git hooks: uma introdu\u00e7\u00e3o<\/h2>\n<p>Um dos principais recursos do <a href=\"https:\/\/git-scm.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Git<\/a> s\u00e3o seus hooks \u2014\u00a0um mecanismo poderoso que permite automatizar tarefas, impor padr\u00f5es e garantir fluxos de trabalho consistentes ao longo de todo o ciclo de vida de um projeto.<\/p>\n<p>Os Git hooks s\u00e3o scripts executados automaticamente em pontos espec\u00edficos do fluxo de trabalho do Git. Voc\u00ea pode us\u00e1-los para personalizar e estender o comportamento do Git para atender \u00e0s necessidades do seu projeto. Os hooks garantem que a qualidade do c\u00f3digo seja mantida, testes sejam executados e as implanta\u00e7\u00f5es sejam orquestradas de forma suave.<\/p>\n<p>O Git oferece v\u00e1rios tipos de hooks, e cada um deles \u00e9 acionado em diferentes est\u00e1gios do fluxo de trabalho do Git:<\/p>\n<ul>\n<li><b>Pre-commit.<\/b> Esses hooks s\u00e3o executados antes de finalizar um commit, permitindo que voc\u00ea imponha estilos de c\u00f3digo, execute testes ou verifique erros de sintaxe.<\/li>\n<li><b>Post-commit. <\/b>\u00c9 executado ap\u00f3s a cria\u00e7\u00e3o de um commit. \u00c9 \u00fatil para notifica\u00e7\u00f5es ou <a href=\"https:\/\/kinsta.com\/pt\/blog\/git-avancado\/\">registros<\/a>.<\/li>\n<li><b>Pre-push.<\/b> Este hook \u00e9 acionado antes de voc\u00ea <a href=\"https:\/\/kinsta.com\/pt\/blog\/push-codigo-github\/\">fazer push de c\u00f3digo<\/a> e permite realizar testes de integra\u00e7\u00e3o, verificar a compatibilidade ou garantir a qualidade.<\/li>\n<li><b>Post-push.<\/b> O hook final \u00e9 executado ap\u00f3s a conclus\u00e3o de um push. Como tal, \u00e9 valioso para implantar c\u00f3digo em produ\u00e7\u00e3o ou atualizar a documenta\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>Voc\u00ea encontrar\u00e1 hooks no diret\u00f3rio <code>.git\/hooks<\/code> do seu reposit\u00f3rio Git. L\u00e1 tamb\u00e9m h\u00e1 hooks de exemplo, que voc\u00ea pode usar como templates para criar seus pr\u00f3prios scripts personalizados. Os hooks abrangem uma s\u00e9rie de a\u00e7\u00f5es e usam o sufixo <b>sample-<\/b> como refer\u00eancia:<\/p>\n<figure id=\"attachment_166981\" aria-describedby=\"caption-attachment-166981\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-166981 size-full\" title=\"Sample Hooks Directory\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/10\/sample-hooks-directory.png\" alt=\"Um diret\u00f3rio local do Git que mostra arquivos de hooks de exemplo.\" width=\"1000\" height=\"644\"><figcaption id=\"caption-attachment-166981\" class=\"wp-caption-text\">Um diret\u00f3rio local do Git que mostra arquivos de hooks de exemplo.<\/figcaption><\/figure>\n<p>Os hooks s\u00e3o acionados durante v\u00e1rias a\u00e7\u00f5es do Git. Por exemplo, um hook de pre-commit \u00e9 executado quando voc\u00ea faz um commit de altera\u00e7\u00f5es, e um hook de pre-push \u00e9 acionado antes de voc\u00ea <a href=\"https:\/\/kinsta.com\/pt\/blog\/git-vs-github\/\">fazer o push para o reposit\u00f3rio remoto<\/a>. Ao entender melhor esses gatilhos, voc\u00ea poder\u00e1 implantar os hooks de forma mais estrat\u00e9gica para impor controle de qualidade e otimizar seu fluxo de trabalho.<\/p>\n<h2>Como criar e instalar Git hooks personalizados<\/h2>\n<p>Criar e instalar Git hooks b\u00e1sicos personalizados pode ser um processo complexo. N\u00e3o obstante, os fundamentos que voc\u00ea usar\u00e1 aqui o preparar\u00e3o para desenvolver hooks avan\u00e7ados posteriormente. Vamos repassar alguns conceitos que se aplicam a todos os hooks que voc\u00ea criar e instalar.<\/p>\n<h3>Escolhendo um tipo de hook adequado<\/h3>\n<p>Empregar o tipo de hook correto para o seu caso de uso espec\u00edfico \u00e9 o importante primeiro passo. Voc\u00ea pode come\u00e7ar por compreender seu pr\u00f3prio fluxo de trabalho e necessidades de desenvolvimento. Esta \u00e9 uma lista r\u00e1pida de considera\u00e7\u00f5es para voc\u00ea verificar:<\/p>\n<ul>\n<li>Primeiro, considere os v\u00e1rios est\u00e1gios do seu processo, como <a href=\"https:\/\/kinsta.com\/pt\/blog\/git-para-desenvolvimento-web\/\">codifica\u00e7\u00e3o, testes e implanta\u00e7\u00e3o<\/a>. Ent\u00e3o identifique onde esse processo poderia se beneficiar de <a href=\"https:\/\/kinsta.com\/pt\/changelog\/kinsta-api\/\">automa\u00e7\u00e3o<\/a> e verifica\u00e7\u00f5es.<\/li>\n<li>A partir da\u00ed, localize pontos em seu fluxo de trabalho em que erros ou inconsist\u00eancias ocorrem com frequ\u00eancia. Os Git hooks personalizados podem ajudar aqui. Por exemplo, se voc\u00ea se esquecer de executar testes antes de um commit, um hook de pre-commit pode resolver o problema.<\/li>\n<li>Em seguida, considere quando voc\u00ea gostaria de executar o hook no seu fluxo de trabalho. Por exemplo, se quiser garantir que todos os commits atendam a <a href=\"https:\/\/kinsta.com\/pt\/blog\/melhores-praticas-html\/\">padr\u00f5es de codifica\u00e7\u00e3o<\/a>, um hook de pre-commit \u00e9 apropriado. Se quiser <a href=\"https:\/\/kinsta.com\/pt\/blog\/ferramentas-de-revisao-de-codigo\/\">validar o c\u00f3digo<\/a> antes de fazer o push para o reposit\u00f3rio remoto, um hook de pre-push ser\u00e1 mais adequado.<\/li>\n<li>Por fim, certifique-se de que o tipo de hook que escolheu \u00e9 compat\u00edvel com seu ambiente de desenvolvimento e com as ferramentas que voc\u00ea usa. Considere a <a href=\"https:\/\/kinsta.com\/pt\/blog\/linguagens-de-script\/\">linguagem de script<\/a> que voc\u00ea usar\u00e1 para o hook e seu ambiente de execu\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>Neste ponto, voc\u00ea deve ser capaz de definir objetivos claros para o seu hook. Pode at\u00e9 ser que cada objetivo exija um tipo diferente de hook. Todavia, embora seja tentador criar scripts para todos os cen\u00e1rios poss\u00edveis, \u00e9 uma boa ideia concentrar-se primeiro nos pontos mais dolorosamente cr\u00edticos.<\/p>\n<h3>Nomea\u00e7\u00e3o e posicionamento de Git hooks personalizados<\/h3>\n<p>Nomear e posicionar corretamente Git hooks personalizados \u00e9 crucial para garantir sua funcionalidade e manuten\u00e7\u00e3o. Assim como as fun\u00e7\u00f5es, os arquivos, os nomes de classe e outros elementos do seu c\u00f3digo, os Git hooks tamb\u00e9m devem ter uma conven\u00e7\u00e3o de nomenclatura consistente e descritiva.<\/p>\n<p>Se os hooks forem dar suporte a v\u00e1rios projetos ao longo do tempo como templates, voc\u00ea pode querer usar prefixos \u2014 talvez com as iniciais do desenvolvedor, um departamento ou um nome de empresa. Em geral, os Git hooks usam letras min\u00fasculas e hifens em prol da legibilidade \u2014 por exemplo, <b>my-project-pre-commit<\/b>.<\/p>\n<p>Al\u00e9m disso, embora voc\u00ea possa armazenar os Git hooks no diret\u00f3rio <b>.git\/hooks<\/b> do seu reposit\u00f3rio, hooks personalizados ficam melhor em um diret\u00f3rio separado dentro da pasta raiz do projeto. Isso evitar\u00e1 substitui\u00e7\u00f5es acidentais durante uma atualiza\u00e7\u00e3o do Git. Contudo, voc\u00ea deve implementar o <a href=\"https:\/\/kinsta.com\/pt\/blog\/controle-de-versoes-wordpress\/\">controle de vers\u00e3o<\/a> para esses hooks junto com o restante do c\u00f3digo do seu projeto.<\/p>\n<h3>Como criar um Git hook b\u00e1sico personalizado<\/h3>\n<p>A maneira t\u00edpica de escrever um Git hook b\u00e1sico \u00e9 criar um novo arquivo com o nome do hook que voc\u00ea escolheu (por exemplo, <b>pre-commit<\/b>) no seu diret\u00f3rio de hooks. Listaremos os nomes dos hooks adiante, quando falarmos sobre par\u00e2metros.<\/p>\n<p>Antes de abrir um arquivo para trabalhar com ele, voc\u00ea deve garantir que ele seja execut\u00e1vel usando o seguinte snippet de linha de comando:<\/p>\n<pre><code class=\"language-bash\">chmod +x path\/to\/file\/hook-name<\/code><\/pre>\n<p>Lembre-se de substituir nossos\u00a0placeholders\u00a0pelas informa\u00e7\u00f5es corretas. Faremos refer\u00eancia a esse snippet ao longo do artigo, pois essa deve ser uma a\u00e7\u00e3o t\u00edpica sempre que voc\u00ea criar um novo Git hook.<\/p>\n<p>Quando o arquivo estiver execut\u00e1vel e aberto, adicione sua l\u00f3gica personalizada usando a linguagem de script que preferir: Bash, <a href=\"https:\/\/kinsta.com\/pt\/blog\/tutoriais-python\/\">Python<\/a>, <a href=\"https:\/\/kinsta.com\/pt\/blog\/ruby-on-rails-vs-node-js\/\">Ruby<\/a> e outras. A cria\u00e7\u00e3o desses scripts, obviamente, est\u00e1 al\u00e9m do escopo do que abordaremos aqui. No entanto, h\u00e1 alguns exemplos de pseudoc\u00f3digo mais adiante para demonstrar casos de uso e cen\u00e1rios espec\u00edficos.<\/p>\n<p>Por fim, antes de fazer o commit de qualquer altera\u00e7\u00e3o, teste seu hook tentando executar a a\u00e7\u00e3o relacionada (como um commit). Essa \u00e9 a abordagem b\u00e1sica para criar Git hooks, mas h\u00e1 muitos casos de uso avan\u00e7ados. Veremos isso a seguir.<\/p>\n<h2>Como criar e instalar hooks personalizados avan\u00e7ados<\/h2>\n<p>A cria\u00e7\u00e3o de Git hooks b\u00e1sicos \u00e9 algo que voc\u00ea far\u00e1 muito ao longo da sua carreira de desenvolvimento. Entretanto, muitas situa\u00e7\u00f5es pedir\u00e3o hooks mais avan\u00e7ados e complexos. A seguir veremos alguns casos de uso e exemplos de hooks para uma variedade de cen\u00e1rios comuns.<\/p>\n<h3>Crie um hook que imponha estilo de c\u00f3digo usando linters<\/h3>\n<p>Usar um linter para impor estilo de c\u00f3digo \u00e9 uma aplica\u00e7\u00e3o fant\u00e1stica dos Git hooks. Ele pode ajudar a manter a qualidade consistente do c\u00f3digo em todo o seu reposit\u00f3rio e deve ser algo de que voc\u00ea tirar\u00e1 muito proveito.<\/p>\n<p>Obviamente, voc\u00ea deve escolher um linter que se adapte \u00e0 linguagem de programa\u00e7\u00e3o do seu projeto. Por exemplo, o <a href=\"https:\/\/pypi.org\/project\/black\/\" target=\"_blank\" rel=\"noopener noreferrer\">Black<\/a> \u00e9 fant\u00e1stico para Python. Aqui, usaremos o <a href=\"https:\/\/eslint.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">ESLint<\/a> para JavaScript para criar um hook de pre-commit.<\/p>\n<p>Primeiro, instale o linter como um pacote global ou local em seu projeto. Voc\u00ea precisar\u00e1 do <a href=\"https:\/\/nodejs.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Node.js<\/a> e do <a href=\"https:\/\/www.npmjs.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">npm<\/a> para isso:<\/p>\n<pre><code class=\"language-bash\">npm install eslint --save-dev<\/code><\/pre>\n<p>Em seguida, navegue at\u00e9 o diret\u00f3rio de hooks no seu reposit\u00f3rio. Crie seu arquivo de pre-commit, e ent\u00e3o escreva um script que execute o linter nos seus arquivos preparados. O hook deve impedir o commit se o linter encontrar qualquer problema. Aqui est\u00e1 um exemplo b\u00e1sico:<\/p>\n<pre><code class=\"language-bash\">#!\/bin\/sh\n\n# Stash unstaged changes (optional but recommended)\ngit stash -q --keep-index\n\n# Run the linter on staged files\nnpm run lint # Replace with the appropriate linting command\nLINT_RESULT=$?\n\n# Unstash the stashed changes (optional but recommended)\ngit stash pop -q\n\n# Exit with the linter's exit code\nexit $LINT_RESULT<\/code><\/pre>\n<p>Quando tiver certeza de que o hook \u00e9 execut\u00e1vel, teste-o por meio de um commit. O hook de pre-commit deve executar o linter. Se houver alguma viola\u00e7\u00e3o de estilo de c\u00f3digo, voc\u00ea n\u00e3o poder\u00e1 concluir o commit at\u00e9 corrigir os problemas.<\/p>\n<p>Obviamente, voc\u00ea deve escrever um hook que funcione com seus pr\u00f3prios <a href=\"https:\/\/kinsta.com\/pt\/blog\/melhor-linguagem-de-programacao\/\">linguagem de programa\u00e7\u00e3o<\/a> e linter, de acordo com o seu projeto. Por exemplo, voc\u00ea poderia estender este exemplo com configura\u00e7\u00f5es de linter, integrando-o ao seu processo de build, e muito mais.<\/p>\n<h3>Implemente um hook para executar testes antes de um commit<\/h3>\n<p>Implementar um hook de pre-commit para executar testes antes de um commit \u00e9 uma excelente maneira de detectar qualquer problema em potencial logo no in\u00edcio. Dessa forma voc\u00ea garante que o commit s\u00f3 passe c\u00f3digo confi\u00e1vel.<\/p>\n<p>Para este exemplo, usaremos o <a href=\"https:\/\/jestjs.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">framework de testes Jest<\/a> para JavaScript. Voc\u00ea deve instalar algo adequado ao seu projeto (como sempre):<\/p>\n<pre><code class=\"language-bash\">npm install jest --save-dev<\/code><\/pre>\n<p>Como em todos os hooks, navegue at\u00e9 o diret\u00f3rio de hooks, crie um novo arquivo, d\u00ea um nome a ele e torne-o execut\u00e1vel. A partir daqui, escreva um script que execute testes em todos os arquivos preparados antes do commit. Aqui est\u00e1 um modelo aproximado:<\/p>\n<pre><code class=\"language-bash\">#!\/bin\/sh\n\n# Stash unstaged changes (optional but recommended)\ngit stash -q --keep-index\n\n# Run tests on staged files\nnpm test # Replace with the appropriate test command\nTEST_RESULT=$?\n\n# Unstash the stashed changes (optional but recommended)\ngit stash pop -q\n\n# Exit with the test's exit code\nexit $TEST_RESULT<\/code><\/pre>\n<p>Quando voc\u00ea tentar dar o commit das altera\u00e7\u00f5es, o hook executar\u00e1 os testes nos arquivos preparados. O commit ser\u00e1 interrompido em caso de qualquer falha nos testes, e voc\u00ea dever\u00e1 resolver os problemas antes de fazer o commit novamente.<\/p>\n<h3>Desenvolva um hook para automatizar o controle de vers\u00e3o e a marca\u00e7\u00e3o<\/h3>\n<p>Uma excelente maneira de simplificar o processo de lan\u00e7amento \u00e9 automatizar o controle de vers\u00e3o e a marca\u00e7\u00e3o no Git. Isso garantir\u00e1 um controle de vers\u00e3o consistente em toda a sua base de c\u00f3digo.<\/p>\n<p>Para come\u00e7ar, escolha um esquema de controle de vers\u00e3o adequado ao seu projeto. Isso est\u00e1 al\u00e9m do escopo do artigo, mas esquemas comuns incluem o Semantic Versioning (SemVer) ou um padr\u00e3o de controle de vers\u00e3o personalizado.<\/p>\n<p>Em seguida, decida exatamente o que o seu hook far\u00e1. Por exemplo, ele pode ler a vers\u00e3o atual, increment\u00e1-la de acordo com um esquema escolhido e atualizar os arquivos necess\u00e1rios com a nova vers\u00e3o. Voc\u00ea tamb\u00e9m desejar\u00e1 escrever um script para criar tags baseadas na vers\u00e3o, que usa comandos do Git para criar tags leves ou anotadas.<\/p>\n<p>Ap\u00f3s criar e definir as permiss\u00f5es para o seu arquivo, voc\u00ea pode come\u00e7ar a escrever o seu hook. Este pode ser um hook complexo e altamente espec\u00edfico que pode inclusive mudar de projeto para projeto. Entretanto, a maioria dos hooks desse tipo incluir\u00e1 o seguinte:<\/p>\n<ul>\n<li>Uma fun\u00e7\u00e3o que incrementa uma parte espec\u00edfica de uma string de vers\u00e3o (por exemplo, <code>1.2.3<\/code>) e retorna a nova vers\u00e3o.<\/li>\n<li>A capacidade de ler a vers\u00e3o atual de um arquivo de vers\u00e3o dedicado.<\/li>\n<li>Uma fun\u00e7\u00e3o para calcular o novo n\u00famero de vers\u00e3o, incluindo qual parte espec\u00edfica incrementar. Por exemplo, <code>0<\/code> para major, <code>1<\/code> para minor, <code>2<\/code> para patch.<\/li>\n<\/ul>\n<p>A partir da\u00ed, o script deve atualizar o arquivo de vers\u00e3o com o novo n\u00famero, criar uma tag leve com a nova vers\u00e3o e, opcionalmente, fazer o push da nova tag para um reposit\u00f3rio remoto. Quando voc\u00ea fizer o commit das altera\u00e7\u00f5es, o hook garantir\u00e1 que cada commit seja associado a uma vers\u00e3o e uma tag apropriadas.<\/p>\n<p>\u00c9 prov\u00e1vel que voc\u00ea queira adequar ainda mais esse hook aos requisitos do seu projeto. Por exemplo, voc\u00ea poderia lidar com casos como criar tags iniciais, manejar conflitos de vers\u00e3o e atualizar refer\u00eancias de vers\u00e3o em arquivos.<\/p>\n<h2>Entendendo par\u00e2metros de hook e vari\u00e1veis de ambiente<\/h2>\n<p>Um dos motivos pelos quais os Git hooks s\u00e3o t\u00e3o poderosos \u00e9 a forma como lidam com vari\u00e1veis din\u00e2micas. No entanto, esse conceito pode ser complexo de entender. A seguir, examinaremos vari\u00e1veis de ambiente e par\u00e2metros de hook, come\u00e7ando por este.<\/p>\n<h3>Como par\u00e2metros passam para os hooks<\/h3>\n<p>Os hooks podem receber par\u00e2metros espec\u00edficos do Git para acessar informa\u00e7\u00f5es contextuais da sua base de c\u00f3digo principal. O Git define par\u00e2metros automaticamente no momento da execu\u00e7\u00e3o, e embora voc\u00ea n\u00e3o precise defini-los especificamente na maioria das vezes, pode ser necess\u00e1rio declar\u00e1-los. \u00c9 essencial entender esses par\u00e2metros para desenvolver hooks eficazes.<\/p>\n<p>Aqui, uma vis\u00e3o geral dos principais pontos a respeito de par\u00e2metros de hook:<\/p>\n<ul>\n<li>Git hooks usam vari\u00e1veis posicionais, em que <code>$1<\/code> se refere ao primeiro par\u00e2metro, <code>$2<\/code> ao segundo par\u00e2metro, e assim por diante. Esses par\u00e2metros n\u00e3o s\u00e3o arbitr\u00e1rios; eles t\u00eam significados e prop\u00f3sitos espec\u00edficos. Assim, embora n\u00e3o sejam &#8220;oficiais&#8221;, eles representam conven\u00e7\u00f5es aceitas ao acessar os valores dos par\u00e2metros.<\/li>\n<li>A ordem dos par\u00e2metros segue um padr\u00e3o espec\u00edfico. O Git passa esses par\u00e2metros para o seu script de hook em uma ordem predeterminada com base no contexto do evento do hook.<\/li>\n<li>Os nomes das vari\u00e1veis refletem a objetivo geral dos par\u00e2metros. Por exemplo, <code>$1<\/code> geralmente cont\u00e9m o caminho para um arquivo, enquanto <code>$2<\/code> pode ser a fonte de uma a\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>Se voc\u00ea adicionar um par\u00e2metro que o hook n\u00e3o possa chamar,\u00a0geralmente\u00a0o script n\u00e3o poder\u00e1 utiliz\u00e1-lo. Os par\u00e2metros s\u00e3o espec\u00edficos para um hook particular e para o contexto de execu\u00e7\u00e3o. Para evitar problemas, voc\u00ea deve usar apenas par\u00e2metros documentados. Contudo, voc\u00ea pode atribuir o valor de um par\u00e2metro posicional a outra vari\u00e1vel e depois us\u00e1-lo em seu script:<\/p>\n<pre><code class=\"language-bash\">#!\/bin\/sh\n\n# Assign $1 to the variable EXAMPLE\nEXAMPLE=$1\n\n# Use EXAMPLE variable\necho \"The commit message file is: $EXAMPLE\"<\/code><\/pre>\n<p>Neste caso, a vari\u00e1vel <code>EXAMPLE<\/code> ter\u00e1 o mesmo valor que <code>$1<\/code>, que \u00e9 o caminho para o arquivo de mensagem de commit. Por\u00e9m, o uso dos nomes documentados de vari\u00e1veis torna seu c\u00f3digo mais compreens\u00edvel.<\/p>\n<p>Observe que, em alguns casos, voc\u00ea usar\u00e1 a <a href=\"https:\/\/www.computerhope.com\/jargon\/s\/stdin.htm\" target=\"_blank\" rel=\"noopener noreferrer\">entrada padr\u00e3o (<code>stdin<\/code><\/a><a href=\"https:\/\/www.computerhope.com\/jargon\/s\/stdin.htm\" target=\"_blank\" rel=\"noopener noreferrer\">)<\/a> para definir par\u00e2metros e, nesse caso, dever\u00e1 incorporar esses elementos aos seus hooks.<\/p>\n<h4>Como encontrar valores e defini\u00e7\u00f5es de par\u00e2metros dos Git hooks<\/h4>\n<p>Visto que cada Git hook ter\u00e1 seus pr\u00f3prios par\u00e2metros, voc\u00ea provavelmente precisar\u00e1 de uma refer\u00eancia para determinar quais s\u00e3o eles ao seu aplicativo espec\u00edfico. A boa not\u00edcia \u00e9 que existem algumas maneiras de fazer isso.<\/p>\n<p>Por exemplo, a <a href=\"https:\/\/git-scm.com\/docs\/githooks\" target=\"_blank\" rel=\"noopener noreferrer\">documenta\u00e7\u00e3o oficial dos Git hooks<\/a> inclui alguns dos par\u00e2metros mais comuns. Entretanto, a melhor abordagem \u00e9 abrir um dos Git hooks de exemplo. Eles consistem em um miniguia sobre como criar o script do hook e incluir\u00e3o defini\u00e7\u00f5es de par\u00e2metros pra voc\u00ea:<\/p>\n<figure id=\"attachment_166982\" aria-describedby=\"caption-attachment-166982\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-166982 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/10\/sample-git-hook.png\" alt=\"Um arquivo de Git hook de exemplo no NeoVim.\" width=\"1000\" height=\"785\"><figcaption id=\"caption-attachment-166982\" class=\"wp-caption-text\">Um arquivo de Git hook de exemplo no NeoVim.<\/figcaption><\/figure>\n<p>Eles s\u00e3o uma excelente maneira de se familiarizar com os Git hooks, e podem at\u00e9 mesmo ajud\u00e1-lo com parte do trabalho de codific\u00e1-los.<\/p>\n<h3>Vari\u00e1veis de ambiente<\/h3>\n<p>Os Git hooks podem buscar argumentos a partir de argumentos da linha de comando e da entrada padr\u00e3o <code>stdin<\/code>, conforme discutimos. No entanto, eles tamb\u00e9m podem buscar argumentos do pr\u00f3prio ambiente, j\u00e1 que s\u00e3o executados dentro de um shell <code>bash<\/code>.<\/p>\n<p>Essas <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-sao-variaveis-de-ambiente\/\">vari\u00e1veis de ambiente<\/a> permitem que voc\u00ea personalize o comportamento dos seus Git hooks e tome decis\u00f5es baseadas em v\u00e1rios aspectos do fluxo de trabalho do Git. Dessa forma, voc\u00ea pode criar Git hooks din\u00e2micos e sens\u00edveis ao contexto. Por exemplo, voc\u00ea pode us\u00e1-los para validar mensagens de commit, controlar o acesso a branches espec\u00edficos ou disparar a\u00e7\u00f5es personalizadas com base na identidade do autor.<\/p>\n<p>A listagem de todas as vari\u00e1veis de ambiente tamb\u00e9m est\u00e1 al\u00e9m do escopo deste artigo. Recomendamos que voc\u00ea consulte a <a href=\"https:\/\/git-scm.com\/book\/en\/v2\/Git-Internals-Environment-Variables\" target=\"_blank\" rel=\"noopener noreferrer\">documenta\u00e7\u00e3o do Git<\/a> e hooks de exemplo para obter dicas sobre quais vari\u00e1veis ser\u00e3o usadas.<\/p>\n<h3>Testando os valores das vari\u00e1veis de ambiente<\/h3>\n<p>O Git normalmente define diferentes vari\u00e1veis de ambiente automaticamente, dependendo do hook que ele chama. Como tal, isso pode causar problemas se voc\u00ea n\u00e3o estiver ciente do que est\u00e1 sendo definido. Por exemplo, considere o seguinte resultado para a vari\u00e1vel <code>GIT_REFLOG_ACTION<\/code> nos hooks de pre-rebase e post-merge:<\/p>\n<ul>\n<li><code>pre-rebase<\/code>. <code>GIT_REFLOG_ACTION=rebase<\/code><\/li>\n<li><code>post-merge<\/code>. <code>GIT_REFLOG_ACTION=\u2019pull other master\u2019<\/code><\/li>\n<\/ul>\n<p>Felizmente, h\u00e1 uma maneira de <a href=\"https:\/\/longair.net\/blog\/2011\/04\/09\/missing-git-hooks-documentation\/\" target=\"_blank\" rel=\"noopener noreferrer\">testar o que o Git far\u00e1<\/a> com as vari\u00e1veis de ambiente usando um pequeno snippet dentro do seu hook:<\/p>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n\necho Running $BASH_SOURCE\nset | egrep GIT\necho PWD is $PWD<\/code><\/pre>\n<p>Para resumir o c\u00f3digo, a linha dois imprime o script em execu\u00e7\u00e3o no momento; a linha tr\u00eas define todas as vari\u00e1veis de ambiente a serem exibidas e, em seguida, filtra-as para aquelas que cont\u00eam &#8220;GIT&#8221; no nome; a linha quatro imprime o diret\u00f3rio de trabalho atual.<\/p>\n<p>Depois de executar isso, voc\u00ea ver\u00e1 a sa\u00edda que corresponde \u00e0s vari\u00e1veis de ambiente associadas ao seu hook. A partir daqui, voc\u00ea ter\u00e1 o conhecimento necess\u00e1rio para garantir que seus pr\u00f3prios Git hooks possam utilizar vari\u00e1veis de ambiente da maneira que desejar.<\/p>\n<h2>Dicas e truques para gerenciar e compartilhar seus Git hooks<\/h2>\n<p>Gerenciar Git hooks em uma equipe ou organiza\u00e7\u00e3o \u00e9 crucial para garantir pr\u00e1ticas de desenvolvimento consistentes e automatizar seus <a href=\"https:\/\/kinsta.com\/pt\/blog\/fluxo-de-trabalho-wordpress\/\">fluxos de trabalho<\/a> de forma eficiente. Por exemplo, considere o simples ato de atribuir um diret\u00f3rio de hooks dedicado para hooks. H\u00e1 dois conselhos que podemos dar aqui:<\/p>\n<ul>\n<li>Crie um reposit\u00f3rio central ou um local compartilhado onde voc\u00ea armazena hooks padronizados. Voc\u00ea pode reutilizar esses hooks em v\u00e1rios projetos e clonar ou vincular ao reposit\u00f3rio para fornecer acesso global.<\/li>\n<li>Organize seus hooks em uma estrutura de registros ou diret\u00f3rios. Isso facilitar\u00e1 para a sua equipe encontrar e usar os hooks de que precisa.<\/li>\n<\/ul>\n<p>Quanto maior a probabilidade de os hooks aparecerem em v\u00e1rios projetos, maior a import\u00e2ncia da documenta\u00e7\u00e3o. Voc\u00ea deve manter uma documenta\u00e7\u00e3o abrangente que descreva a finalidade, formas de uso e op\u00e7\u00f5es de configura\u00e7\u00e3o de cada hook no reposit\u00f3rio. Revis\u00f5es de c\u00f3digo e estrat\u00e9gias de atualiza\u00e7\u00e3o para esses hooks globais tamb\u00e9m s\u00e3o essenciais.<\/p>\n<p>Recomendamos tamb\u00e9m que voc\u00ea armazene os hooks personalizados no Sistema de Controle de Vers\u00e3o (Version Control System, VCS) junto com a base de c\u00f3digo do projeto. Isso garante que toda a equipe tenha acesso \u00e0 biblioteca de hooks inteira.<\/p>\n<h3>Usando Git hooks do lado do servidor<\/h3>\n<p>Os hooks do lado do servidor ser\u00e3o executados no servidor que hospeda o reposit\u00f3rio central do Git. Dessa forma, voc\u00ea pode aplicar pol\u00edticas, realizar verifica\u00e7\u00f5es ou disparar a\u00e7\u00f5es do lado do servidor.<\/p>\n<p>Voc\u00ea tem duas op\u00e7\u00f5es de armazenamento para seus hooks do lado do servidor: dentro do VCS com o projeto, ou em reposit\u00f3rios separados.<\/p>\n<h4>Armazenamento de hooks do lado do servidor usando um VCS<\/h4>\n<p>H\u00e1 duas vantagens em usar o VCS para armazenar hooks do <a href=\"https:\/\/kinsta.com\/pt\/blog\/arquitetura-aplicativos-web\/\">lado do servidor<\/a>. Primeiro, voc\u00ea pode assegurar que os hooks tenham o mesmo controle de vers\u00e3o e manuten\u00e7\u00e3o que o restante da sua base de c\u00f3digo. Segundo, voc\u00ea s\u00f3 precisar\u00e1 clonar um reposit\u00f3rio para acessar o c\u00f3digo do projeto e os hooks.<\/p>\n<p>Todavia, dependendo da natureza dos hooks espec\u00edficos, armazen\u00e1-los no mesmo reposit\u00f3rio pode gerar preocupa\u00e7\u00f5es de seguran\u00e7a se esses hooks acessarem informa\u00e7\u00f5es confidenciais. Al\u00e9m disso, se os hooks forem complexos ou exigirem configura\u00e7\u00f5es espec\u00edficas, isso poder\u00e1 aumentar a complexidade do seu reposit\u00f3rio principal.<\/p>\n<h4>Armazenamento de hooks do lado do servidor em reposit\u00f3rios separados<\/h4>\n<p>Manter hooks do lado do servidor em reposit\u00f3rios separados permite que voc\u00ea os atualize e controle sua vers\u00e3o de forma independente da sua base de c\u00f3digo, o que pode reduzir poss\u00edveis conflitos. Essa modularidade pode oferecer maior flexibilidade.<\/p>\n<p>Al\u00e9m disso, voc\u00ea pode armazenar esses hooks em reposit\u00f3rios com acesso restrito. Isso o ajudar\u00e1 a reduzir o risco de exposi\u00e7\u00e3o de dados confidenciais.<\/p>\n<p>Por outro lado, a manuten\u00e7\u00e3o de <a href=\"https:\/\/kinsta.com\/pt\/blog\/monorepo-vs-multi-repo\/\">m\u00faltiplos reposit\u00f3rios<\/a> pode exigir esfor\u00e7o adicional. Ademais, se os hooks dependerem de vers\u00f5es espec\u00edficas da sua base de c\u00f3digo principal, pode ser um desafio coordenar as altera\u00e7\u00f5es entre os reposit\u00f3rios.<\/p>\n<h3>Automatiza\u00e7\u00e3o de instala\u00e7\u00f5es de hooks<\/h3>\n<p>Automatizar as instala\u00e7\u00f5es de hooks em m\u00faltiplos reposit\u00f3rios pode economizar tempo e garantir a consist\u00eancia do seu fluxo de trabalho de desenvolvimento. Usando scripts e templates, voc\u00ea pode configurar facilmente hooks em v\u00e1rios reposit\u00f3rios sem interven\u00e7\u00e3o manual.<\/p>\n<p>O processo come\u00e7a com um reposit\u00f3rio dedicado que cont\u00e9m seus hooks globais. Voc\u00ea desejar\u00e1 padroniz\u00e1-los: por exemplo, evite codificar caminhos ou valores espec\u00edficos de um \u00fanico reposit\u00f3rio.<\/p>\n<p>A partir da\u00ed, voc\u00ea pode come\u00e7ar a escrever o seu script de instala\u00e7\u00e3o. Por exemplo, o pseudoc\u00f3digo a seguir clonar\u00e1 um reposit\u00f3rio de templates de hooks e copiar\u00e1 os hooks (ou <a href=\"https:\/\/kinsta.com\/blog\/managing-wordpress-development-with-symlinks\/\">far\u00e1 um link simb\u00f3lico<\/a>\u00a0deles) para o diret\u00f3rio <b>.git\/hooks<\/b> de cada reposit\u00f3rio:<\/p>\n<pre><code class=\"language-bash\"># Example installation script\n# Usage: .\/install_hooks.sh \/path\/to\/repository\nTEMPLATE_REPO=\"https:\/\/github.com\/yourusername\/hooks-template.git\"\nREPO_PATH=\"$1\"\nREPO_NAME=$(basename \"$REPO_PATH\")\n\n# Clone the template repository\ngit clone --depth 1 \"$TEMPLATE_REPO\" \"$REPO_NAME-hooks\"\n\n# Copy or symlink hooks to the repository\ncp -r \"$REPO_NAME-hooks\/hooks\" \"$REPO_PATH\/.git\/\"\nrm -rf \"$REPO_NAME-hooks\"\necho \"Hooks installed in $REPO_NAME\u201d<\/code><\/pre>\n<p>Ap\u00f3s salvar as altera\u00e7\u00f5es, voc\u00ea pode executar o script de instala\u00e7\u00e3o para cada reposit\u00f3rio em que deseja instalar os hooks:<\/p>\n<pre><code class=\"language-bash\">.\/install_hooks.sh \/path\/to\/repository1\n.\/install_hooks.sh \/path\/to\/repository2\n# \u2026<\/code><\/pre>\n<p>Fa\u00e7a altera\u00e7\u00f5es no reposit\u00f3rio de templates sempre que precisar atualizar ou adicionar hooks. Da pr\u00f3xima vez que voc\u00ea executar o script de instala\u00e7\u00e3o em um reposit\u00f3rio, os hooks atualizados ser\u00e3o instalados.<\/p>\n<h3>Templates do Git<\/h3>\n<p>Os templates do Git permitem definir hooks e configura\u00e7\u00f5es comuns para novos reposit\u00f3rios. Eles fornecem uma abordagem sistem\u00e1tica para ajud\u00e1-lo a automatizar defini\u00e7\u00f5es, configura\u00e7\u00f5es e outros elementos quando voc\u00ea criar ou clonar novos reposit\u00f3rios. Dessa forma, voc\u00ea pode garantir que todos os reposit\u00f3rios sigam suas pr\u00e1ticas t\u00edpicas e estabelecidas.<\/p>\n<p>Ap\u00f3s criar um diret\u00f3rio de template e adicionar seus scripts de hook, voc\u00ea pode configurar o Git para usar o diret\u00f3rio como o template para novos reposit\u00f3rios. Voc\u00ea pode configurar isso em uma base global ou local para cada usu\u00e1rio.<\/p>\n<p>Para configura\u00e7\u00f5es globais, aponte para o seu diret\u00f3rio de templates de hooks:<\/p>\n<pre><code class=\"language-bash\">git config --global init.templateDir \/path\/to\/hooks-template<\/code><\/pre>\n<p>Para configura\u00e7\u00f5es locais, voc\u00ea pode especificar o reposit\u00f3rio exato:<\/p>\n<pre><code class=\"language-bash\">git init --template=\/path\/to\/hooks-template<code><\/code><\/code><\/pre>\n<p>Sempre que voc\u00ea criar um novo reposit\u00f3rio usando <code>git init<\/code> ou clonar um reposit\u00f3rio existente, o Git copiar\u00e1 automaticamente o conte\u00fado do seu diret\u00f3rio de templates de hooks para o diret\u00f3rio <b>.git<\/b> no novo reposit\u00f3rio.<\/p>\n<p>Por fim, embora hooks de template possam ser gen\u00e9ricos, voc\u00ea tamb\u00e9m pode permitir a personaliza\u00e7\u00e3o de hooks com base em necessidades espec\u00edficas. Por exemplo, um script poderia verificar a exist\u00eancia de um arquivo de configura\u00e7\u00e3o de hook espec\u00edfico para um reposit\u00f3rio e utiliz\u00e1-lo se estiver presente.<\/p>\n<h2>Pr\u00e1ticas t\u00edpicas para ajud\u00e1-lo a manter os Git hooks seguros<\/h2>\n<p>O uso de Git hooks pode ser poderoso para automa\u00e7\u00e3o de processos e aplica\u00e7\u00e3o de pr\u00e1ticas t\u00edpicas. No entanto, isso tem o potencial de introduzir vulnerabilidades se voc\u00ea n\u00e3o gerenciar seus hooks de maneira adequada.<\/p>\n<p>Aqui est\u00e1 uma lista r\u00e1pida de pr\u00e1ticas que voc\u00ea pode implementar em seus pr\u00f3prios hooks:<\/p>\n<ul>\n<li>Certifique-se de revisar e restringir as <a href=\"https:\/\/docs.sevalla.com\/applications\/git\/github#authenticate-and-authorize\">permiss\u00f5es<\/a> dos hooks, especialmente se forem exemplos de terceiros.<\/li>\n<li>Sempre valide e saneie seus par\u00e2metros de entrada para mitigar <a href=\"https:\/\/kinsta.com\/pt\/blog\/injecao-sql\/\">inje\u00e7\u00f5es de c\u00f3digo<\/a>. Use pr\u00e1ticas seguras, como evitar o uso direto de entradas de usu\u00e1rio em seus scripts.<\/li>\n<li>Certifique-se de que os hooks n\u00e3o incluam informa\u00e7\u00f5es confidenciais. \u00c9 nesse ponto que vari\u00e1veis de ambiente ou armazenamento seguro oferecem um valor imenso.<\/li>\n<li>Revise e teste os hooks regularmente para evitar o consumo inintencional de recursos. Isso pode at\u00e9 resultar em ataques de <a href=\"https:\/\/kinsta.com\/pt\/blog\/ataque-de-ddos\/\">Nega\u00e7\u00e3o de Servi\u00e7o Distribu\u00eddo (Distributed Denial of Service &#8211; DDoS)<\/a>.<\/li>\n<\/ul>\n<p>\u00c9 desej\u00e1vel tamb\u00e9m implementar um processo completo e abrangente de teste e revis\u00e3o. Isso ajudar\u00e1 a evitar vulnerabilidades e outros erros no futuro.<\/p>\n<h3>Valida\u00e7\u00e3o<\/h3>\n<p>Precisamos falar um pouco mais sobre a implementa\u00e7\u00e3o de valida\u00e7\u00e3o adequada e <a href=\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/\">tratamento de erros<\/a> em seus hooks. Isso \u00e9 fundamental para garantir confiabilidade, estabilidade e seguran\u00e7a.<\/p>\n<p>Por exemplo, voc\u00ea deve sempre validar todas as entradas ou par\u00e2metros que os scripts dos seus hooks recebem. Contudo, h\u00e1 muito mais que voc\u00ea pode fazer para garantir uma boa valida\u00e7\u00e3o. Voc\u00ea pode garantir que o reposit\u00f3rio esteja no estado esperado para que o hook seja executado com \u00eaxito. Por exemplo, em um hook de pre-commit, certifique-se de deixar os arquivos preparados necess\u00e1rios antes do commit.<\/p>\n<figure id=\"attachment_166983\" aria-describedby=\"caption-attachment-166983\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-166983 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/10\/hook-exit-code.png\" alt=\"Uma parte de um arquivo de Git hook mostrando o c\u00f3digo exit 0 como linha final.\" width=\"1000\" height=\"487\"><figcaption id=\"caption-attachment-166983\" class=\"wp-caption-text\">Uma parte de um arquivo de Git hook mostrando o c\u00f3digo exit 0 como linha final.<\/figcaption><\/figure>\n<p>O tratamento de erros tamb\u00e9m \u00e9 valioso. C\u00f3digos de sa\u00edda s\u00e3o t\u00e3o importantes nos hooks quanto na base de c\u00f3digo, assim como registros de erro e mensagens de erro informativas. A &#8220;falha graciosa&#8221; deve ser o seu objetivo aqui, assim como seria com bases de c\u00f3digo maiores.<\/p>\n<p>\u00c9 claro que, em um cen\u00e1rio real, seus hooks podem precisar de uma l\u00f3gica de valida\u00e7\u00e3o e tratamento de erros mais complexa. Isso significa que os testes regulares s\u00e3o ainda mais importantes do que antes.<\/p>\n<h3>A\u00e7\u00f5es destrutivas acidentais<\/h3>\n<p>Acidentes acontecem; ent\u00e3o, configurar seus Git hooks para evitar a\u00e7\u00f5es destrutivas indesejadas \u00e9 crucial para proteger contra perda ou danos dos dados. Os hooks podem essencialmente atuar como redes de seguran\u00e7a por meio de solicita\u00e7\u00f5es de confirma\u00e7\u00e3o do usu\u00e1rio para a\u00e7\u00f5es potencialmente prejudiciais.<\/p>\n<p>Hooks de pre-receive e pre-commit funcionam bem aqui. Vamos examinar rapidamente como ambos podem ajudar voc\u00ea:<\/p>\n<ul>\n<li><b>Hooks de pre-receive ajudam em verifica\u00e7\u00f5es do lado do servidor.<\/b> S\u00e3o acionados antes de aceitar novos branches ou tags do cliente. Seu script deve examinar as refer\u00eancias recebidas, verificar se h\u00e1 a\u00e7\u00f5es como force pushes ou exclus\u00f5es de branches e solicitar confirma\u00e7\u00e3o do usu\u00e1rio. Voc\u00ea tamb\u00e9m desejar\u00e1 analisar as refer\u00eancias enviadas para determinar se envolvem a\u00e7\u00f5es como force pushing (<code>--force<\/code>) ou <a href=\"https:\/\/kinsta.com\/pt\/blog\/git-delete-local-branch\/\">exclus\u00e3o de branch<\/a>.<\/li>\n<li><b>Hooks de pre-commit funcionam no lado do cliente e s\u00e3o executados antes de voc\u00ea finalizar um commit.<\/b> Embora n\u00e3o impe\u00e7am diretamente a\u00e7\u00f5es destrutivas no servidor, eles podem ajudar a evitar erros locais antes de fazer o push. Seu script deve analisar as altera\u00e7\u00f5es preparadas e procurar por elementos como comandos de <code>force push<\/code> nas mensagens de commit. A partir da\u00ed, exiba uma mensagem de aviso ou erro para o usu\u00e1rio.<\/li>\n<\/ul>\n<p>No entanto, independentemente das pr\u00e1ticas que voc\u00ea implementar, elas devem ser seguras, eficientes e adequadas \u00e0s suas necessidades. Isso exigir\u00e1 uma revis\u00e3o completa e uma estrat\u00e9gia de testes.<\/p>\n<h3>Revis\u00e3o e testes de Git hooks<\/h3>\n<p>Revisar e testar os hooks \u00e9 essencial para garantir que funcionem corretamente e se alinhem com o seu fluxo de trabalho de desenvolvimento. Revis\u00f5es por pares, documenta\u00e7\u00e3o clara, uma abund\u00e2ncia de coment\u00e1rios e outras a\u00e7\u00f5es podem ajudar a assegurar que os hooks estejam prontos para a produ\u00e7\u00e3o.<\/p>\n<p>Quando se trata de testes, \u00e9 importante realiz\u00e1-los de forma isolada, usando dados de amostra diversos. Voc\u00ea tamb\u00e9m pode implementar testes automatizados de regress\u00e3o ou integra\u00e7\u00e3o.<\/p>\n<p>Por fim, recomendamos testar os hooks em diferentes ambientes (como os seus servidores de <a href=\"https:\/\/kinsta.com\/pt\/devkinsta\/\">desenvolvimento<\/a>, <a href=\"https:\/\/kinsta.com\/pt\/hospedagem-wordpress\/ambientes-de-teste\/\">testes<\/a> e <a href=\"https:\/\/kinsta.com\/pt\/docs\/hospedagem-de-wordpress\/ambiente-de-teste\/#push-staging-to-live-1\">produ\u00e7\u00e3o<\/a>) para garantir que apresentem um comportamento consistente. Uma configura\u00e7\u00e3o de registros em tempo real ajudar\u00e1 nesse caso, pois pode mostrar o que acontece quando os dados s\u00e3o movidos de servidor para servidor.<\/p>\n<h2>Como solucionar problemas com seus hooks<\/h2>\n<p>Assim como em qualquer base de c\u00f3digo, voc\u00ea tamb\u00e9m pode ter de solucionar problemas em seus hooks \u2014 mesmo que isso exija algumas tentativas. Na verdade, n\u00e3o importa qual o tipo do seu Git hook, voc\u00ea descobrir\u00e1 que os mesmos erros aparecem repetidamente. Muitos desses ser\u00e3o problemas simples que afetam todo tipo de projeto, como erros de sintaxe, problemas com permiss\u00f5es, uso de caminhos relativos ou codificados de forma r\u00edgida, e muito mais.<\/p>\n<p>Todavia, tamb\u00e9m \u00e9 uma boa ideia verificar se h\u00e1 depend\u00eancias ausentes, pois alguns hooks dependem de ferramentas, arquivos ou bibliotecas externas. Assim, voc\u00ea precisa disponibiliz\u00e1-los no ambiente em que executa o hook.<\/p>\n<p>Por\u00e9m, tamb\u00e9m podem surgir problemas espec\u00edficos dos Git hooks. Por exemplo, os hooks devem sair com um c\u00f3digo de status diferente de zero para indicar uma falha. Al\u00e9m disso, os hooks n\u00e3o devem conter loops infinitos. Sem essas duas precau\u00e7\u00f5es, voc\u00ea pode causar comportamentos inesperados e interromper seu fluxo de trabalho.<\/p>\n<p>Voc\u00ea tamb\u00e9m pode\u00a0descobrir que conflitos entre dois hooks\u00a0resultam em intera\u00e7\u00f5es e consequ\u00eancias indesejadas. As chamadas <a style=\"font-size: 1rem\" href=\"https:\/\/www.techtarget.com\/searchstorage\/definition\/race-condition\" target=\"_blank\" rel=\"noopener noreferrer\">&#8220;condi\u00e7\u00f5es de corrida&#8221;<\/a> tamb\u00e9m podem frustrar suas expectativas. Isso ocorre quando dois ou mais hooks s\u00e3o acionados por eventos semelhantes, mas um deles \u00e9 conclu\u00eddo antes do outro \u2014 com impacto no resultado esperado.<\/p>\n<p>\u00c9 nesse ponto que as revis\u00f5es e os testes se tornam essenciais. Manter a documenta\u00e7\u00e3o tamb\u00e9m \u00e9 importante para evitar problemas e garantir que os hooks funcionem como voc\u00ea espera.<\/p>\n<p>Falando em documenta\u00e7\u00e3o, o <a href=\"https:\/\/git-scm.com\/book\/en\/v2\/Customizing-Git-Git-Hooks\" target=\"_blank\" rel=\"noopener noreferrer\">pr\u00f3prio material de refer\u00eancia do Git<\/a> \u00e9 uma leitura essencial. Na verdade, juntamente com este artigo, e talvez o site do guia independente <a href=\"https:\/\/githooks.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Git Hooks<\/a> (usando o <a href=\"https:\/\/kinsta.com\/pt\/blog\/criando-site-estatico-github-pages\/\">GitHub Pages<\/a>), voc\u00ea n\u00e3o dever\u00e1 sentir falta de material de leitura.<\/p>\n<figure id=\"attachment_166984\" aria-describedby=\"caption-attachment-166984\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-166984 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/10\/git-hooks-website.png\" alt=\"O site do guia Git Hooks.\" width=\"1000\" height=\"571\"><figcaption id=\"caption-attachment-166984\" class=\"wp-caption-text\">O site do guia Git Hooks.<\/figcaption><\/figure>\n<p>Entretanto, voc\u00ea tamb\u00e9m pode procurar aplicativos para ajud\u00e1-lo a gerenciar os Git hooks. O <a href=\"https:\/\/github.com\/evilmartians\/lefthook\" target=\"_blank\" rel=\"noopener noreferrer\">Lefthook<\/a> tem atualiza\u00e7\u00f5es regulares e bastante suporte no GitHub, enquanto o <a href=\"https:\/\/typicode.github.io\/husky\/\" target=\"_blank\" rel=\"noopener noreferrer\">Husky<\/a> \u00e9 \u00f3timo para fazer linting de suas mensagens de commit.<\/p>\n<h2>Os benef\u00edcios de integrar hooks em pipelines de integra\u00e7\u00e3o cont\u00ednua (CI\/CD)<\/h2>\n<p>Os pipelines de CI\/CD funcionam bem com os Git hooks, pois esses scripts podem ajudar voc\u00ea a automatizar tarefas, garantir qualidade consistente e fornecer verifica\u00e7\u00f5es de seguran\u00e7a.<\/p>\n<p>Por exemplo, hooks de pre-commit permitem que voc\u00ea execute verifica\u00e7\u00f5es de qualidade de c\u00f3digo, como linting, an\u00e1lise est\u00e1tica e formata\u00e7\u00e3o. Quando se trata de testes, voc\u00ea pode acionar testes unit\u00e1rios, su\u00edtes de testes ou outras verifica\u00e7\u00f5es automatizadas no est\u00e1gio de pre-commit. Por outro lado, hooks de pre-push permitem executar testes de integra\u00e7\u00e3o, <a href=\"https:\/\/kinsta.com\/pt\/blog\/verificacao-de-seguranca-do-site\/\">varredura de seguran\u00e7a<\/a>, e outros.<\/p>\n<p>H\u00e1 muitos benef\u00edcios que voc\u00ea pode aproveitar com o uso de hooks em seus pipelines de CI\/CD:<\/p>\n<ul>\n<li><b>Consist\u00eancia.<\/b> Os hooks permitem que voc\u00ea imponha pr\u00e1ticas consistentes em todos os commits e implanta\u00e7\u00f5es, o que reduzir\u00e1 erros em toda a linha.<\/li>\n<li><b>Verifica\u00e7\u00f5es automatizadas.<\/b> Voc\u00ea pode automatizar verifica\u00e7\u00f5es de qualidade de c\u00f3digo, testes, varreduras de seguran\u00e7a e outras tarefas importantes. Isso reduzir\u00e1 o trabalho manual e lhe proporcionar\u00e1 mais tempo para se dedicar a outras tarefas.<\/li>\n<li><b>Detec\u00e7\u00e3o precoce de problemas.<\/b> Os hooks permitir\u00e3o que voc\u00ea detecte problemas no processo de desenvolvimento mais cedo, prevenindo que se propaguem pelo pipeline.<\/li>\n<li><b>Redu\u00e7\u00e3o de riscos de implanta\u00e7\u00e3o.<\/b> Com verifica\u00e7\u00f5es e testes automatizados acionados por hooks, o risco de implantar c\u00f3digo defeituoso pode ser significativamente reduzido.<\/li>\n<\/ul>\n<p>Como a <a href=\"https:\/\/kinsta.com\/pt\/docs\/kinsta-api\/\">API da Kinsta<\/a> permite <a href=\"https:\/\/kinsta.com\/pt\/blog\/como-configurar-pipeline-ci-cd\/\">configurar pipelines de CI\/CD<\/a>, tamb\u00e9m \u00e9 poss\u00edvel integrar Git hooks aqui. A Kinsta possibilita <a href=\"https:\/\/kinsta.com\/pt\/docs\/hospedagem-de-wordpress\/gerenciamento-de-site\/git\/\">baixar todo o seu reposit\u00f3rio<\/a> de um local remoto e permite pushes usando um plugin de terceiros, tal como o <a href=\"https:\/\/wppusher.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">WP Pusher<\/a>.<\/p>\n<figure id=\"attachment_166985\" aria-describedby=\"caption-attachment-166985\" style=\"width: 1000px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-166985 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2023\/10\/wppusher-home-page.png\" alt=\"A p\u00e1gina inicial do WP Pusher.\" width=\"1000\" height=\"525\"><figcaption id=\"caption-attachment-166985\" class=\"wp-caption-text\">A p\u00e1gina inicial do WP Pusher.<\/figcaption><\/figure>\n<p>Naturalmente, isso tamb\u00e9m significa que voc\u00ea tem a op\u00e7\u00e3o de utilizar Git hooks. Dessa forma, sua instala\u00e7\u00e3o na Kinsta pode aproveitar-se desses poderosos scripts em seu reposit\u00f3rio.<\/p>\n<h2>Resumo<\/h2>\n<p>O <a href=\"https:\/\/git-scm.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Git<\/a> \u00e9 uma ferramenta essencial para qualquer projeto de desenvolvimento, mas um aspecto dele em particular pode turbinar seu fluxo de trabalho de codifica\u00e7\u00e3o e implanta\u00e7\u00e3o. Os Git hooks permitem que voc\u00ea crie scripts usando v\u00e1rias linguagens para automatizar v\u00e1rios aspectos do seu processo de controle de vers\u00e3o. \u00c9 um conceito simples, mas com uma estrutura subjacente um tanto complexa.<\/p>\n<p>Nosso artigo mostra como usar t\u00e9cnicas avan\u00e7adas para aproveitar ao m\u00e1ximo os Git hooks. Voc\u00ea pode us\u00e1-los localmente e do lado do servidor, torn\u00e1-los din\u00e2micos usando par\u00e2metros e vari\u00e1veis, trabalhar com m\u00faltiplos reposit\u00f3rios remotos, e muito mais. Na verdade, a esta altura, sugerimos que os Git hooks se tornem sua arma secreta para aumentar a produtividade e a qualidade do c\u00f3digo, e reduzir o tempo de conclus\u00e3o do projeto.<\/p>\n<p>Tem alguma d\u00favida sobre Git hooks e como us\u00e1-los? Conte pra gente na se\u00e7\u00e3o de coment\u00e1rios abaixo!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>O Git pode parecer complexo, mas algumas de suas funcionalidades, como os Git hooks, exigem um entendimento mais aprofundado. Os Git hooks s\u00e3o scripts que o &#8230;<\/p>\n","protected":false},"author":199,"featured_media":64687,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[],"topic":[969],"class_list":["post-64686","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","topic-git"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Dominando os Git Hooks: T\u00e9cnicas Avan\u00e7adas e Pr\u00e1ticas Recomendadas<\/title>\n<meta name=\"description\" content=\"O Git oferece um modo de usar scripts personalizados para determinados eventos de reposit\u00f3rio. Saiba mais sobre os Git hooks, incluindo algumas t\u00e9cnicas avan\u00e7adas para us\u00e1-los!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dominando os Git Hooks: T\u00e9cnicas Avan\u00e7adas e Pr\u00e1ticas Recomendadas\" \/>\n<meta property=\"og:description\" content=\"O Git oferece um modo de usar scripts personalizados para determinados eventos de reposit\u00f3rio. Saiba mais sobre os Git hooks, incluindo algumas t\u00e9cnicas avan\u00e7adas para us\u00e1-los!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-12-07T10:16:34+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-12T13:57:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Jeremy Holcombe\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"O Git oferece um modo de usar scripts personalizados para determinados eventos de reposit\u00f3rio. Saiba mais sobre os Git hooks, incluindo algumas t\u00e9cnicas avan\u00e7adas para us\u00e1-los!\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeremy Holcombe\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/\"},\"author\":{\"name\":\"Jeremy Holcombe\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\"},\"headline\":\"Dominando os Git Hooks: T\u00e9cnicas Avan\u00e7adas e Pr\u00e1ticas Recomendadas\",\"datePublished\":\"2023-12-07T10:16:34+00:00\",\"dateModified\":\"2023-12-12T13:57:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/\"},\"wordCount\":5578,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg\",\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/\",\"name\":\"Dominando os Git Hooks: T\u00e9cnicas Avan\u00e7adas e Pr\u00e1ticas Recomendadas\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg\",\"datePublished\":\"2023-12-07T10:16:34+00:00\",\"dateModified\":\"2023-12-12T13:57:37+00:00\",\"description\":\"O Git oferece um modo de usar scripts personalizados para determinados eventos de reposit\u00f3rio. Saiba mais sobre os Git hooks, incluindo algumas t\u00e9cnicas avan\u00e7adas para us\u00e1-los!\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Git\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/git\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Dominando os Git Hooks: T\u00e9cnicas Avan\u00e7adas e Pr\u00e1ticas Recomendadas\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21\",\"name\":\"Jeremy Holcombe\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g\",\"caption\":\"Jeremy Holcombe\"},\"description\":\"Senior Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/jeremyholcombe\/\"],\"url\":\"https:\/\/kinsta.com\/pt\/blog\/author\/jeremyholcombe\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Dominando os Git Hooks: T\u00e9cnicas Avan\u00e7adas e Pr\u00e1ticas Recomendadas","description":"O Git oferece um modo de usar scripts personalizados para determinados eventos de reposit\u00f3rio. Saiba mais sobre os Git hooks, incluindo algumas t\u00e9cnicas avan\u00e7adas para us\u00e1-los!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/","og_locale":"pt_PT","og_type":"article","og_title":"Dominando os Git Hooks: T\u00e9cnicas Avan\u00e7adas e Pr\u00e1ticas Recomendadas","og_description":"O Git oferece um modo de usar scripts personalizados para determinados eventos de reposit\u00f3rio. Saiba mais sobre os Git hooks, incluindo algumas t\u00e9cnicas avan\u00e7adas para us\u00e1-los!","og_url":"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2023-12-07T10:16:34+00:00","article_modified_time":"2023-12-12T13:57:37+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg","type":"image\/jpeg"}],"author":"Jeremy Holcombe","twitter_card":"summary_large_image","twitter_description":"O Git oferece um modo de usar scripts personalizados para determinados eventos de reposit\u00f3rio. Saiba mais sobre os Git hooks, incluindo algumas t\u00e9cnicas avan\u00e7adas para us\u00e1-los!","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg","twitter_creator":"@kinsta_pt","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Jeremy Holcombe","Tempo estimado de leitura":"24 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/"},"author":{"name":"Jeremy Holcombe","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21"},"headline":"Dominando os Git Hooks: T\u00e9cnicas Avan\u00e7adas e Pr\u00e1ticas Recomendadas","datePublished":"2023-12-07T10:16:34+00:00","dateModified":"2023-12-12T13:57:37+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/"},"wordCount":5578,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg","inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/","url":"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/","name":"Dominando os Git Hooks: T\u00e9cnicas Avan\u00e7adas e Pr\u00e1ticas Recomendadas","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg","datePublished":"2023-12-07T10:16:34+00:00","dateModified":"2023-12-12T13:57:37+00:00","description":"O Git oferece um modo de usar scripts personalizados para determinados eventos de reposit\u00f3rio. Saiba mais sobre os Git hooks, incluindo algumas t\u00e9cnicas avan\u00e7adas para us\u00e1-los!","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/git-hooks\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/11\/mastering-git-hooks-advanced-techniques-and-best-practices.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/git-hooks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Git","item":"https:\/\/kinsta.com\/pt\/topicos\/git\/"},{"@type":"ListItem","position":3,"name":"Dominando os Git Hooks: T\u00e9cnicas Avan\u00e7adas e Pr\u00e1ticas Recomendadas"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/4eee42881d7b5a73ebb4f58dd5223b21","name":"Jeremy Holcombe","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0e17001f3bb37dbbe54fceef9bb547fa?s=96&d=mm&r=g","caption":"Jeremy Holcombe"},"description":"Senior Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems.","sameAs":["https:\/\/www.linkedin.com\/in\/jeremyholcombe\/"],"url":"https:\/\/kinsta.com\/pt\/blog\/author\/jeremyholcombe\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/64686","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/199"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=64686"}],"version-history":[{"count":14,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/64686\/revisions"}],"predecessor-version":[{"id":65936,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/64686\/revisions\/65936"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/64686\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/64686\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/64686\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/64686\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/64686\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/64686\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/64686\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/64686\/translations\/es"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/64686\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/64687"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=64686"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=64686"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=64686"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}