<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Helen Dias</title>
    <description>The latest articles on DEV Community by Helen Dias (@helendias).</description>
    <link>https://dev.to/helendias</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F240582%2F92fc8fde-893b-43d4-be1b-1724bc6463b3.png</url>
      <title>DEV Community: Helen Dias</title>
      <link>https://dev.to/helendias</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/helendias"/>
    <language>en</language>
    <item>
      <title>Configurando Git Hooks com Husky</title>
      <dc:creator>Helen Dias</dc:creator>
      <pubDate>Sun, 09 Aug 2020 21:08:23 +0000</pubDate>
      <link>https://dev.to/helendias/configurando-git-hooks-com-husky-43ne</link>
      <guid>https://dev.to/helendias/configurando-git-hooks-com-husky-43ne</guid>
      <description>&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Introdução&lt;/li&gt;
&lt;li&gt;O que são Git Hooks?&lt;/li&gt;
&lt;li&gt;Quando esses Hooks são normalmente disparados?&lt;/li&gt;
&lt;li&gt;O que é Husky?&lt;/li&gt;
&lt;li&gt;Instalando o Husky&lt;/li&gt;
&lt;li&gt;Criando o primeiro Hook com pre-commit&lt;/li&gt;
&lt;li&gt;Hooks com pre-push&lt;/li&gt;
&lt;li&gt;Criando o segundo Hook com pre-push&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Olá, pessoas!
&lt;/h2&gt;

&lt;p&gt;Gostaria de compartilhar um pouco do que andei estudando sobre &lt;strong&gt;Git Hooks&lt;/strong&gt; com &lt;strong&gt;Husky&lt;/strong&gt; na minha primeira publicação aqui.&lt;/p&gt;

&lt;p&gt;Antes de tudo, vamos contextualizar um pouco.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que são Git Hooks?
&lt;/h2&gt;

&lt;p&gt;Segundo a &lt;a href="https://git-scm.com/book/pt-br/v2/Customizing-Git-Git-Hooks" rel="noopener noreferrer"&gt;documentação oficial do Git&lt;/a&gt;, Git Hooks são:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Scripts personalizados&lt;/strong&gt; que podem ser disparados quando alguma ação importante acontece.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esses Hooks/Scripts podem ser disparados tanto no lado do servidor quanto no lado do cliente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quando esses Hooks são normalmente disparados?
&lt;/h3&gt;

&lt;p&gt;No lado do cliente: quando ocorre alguma operação de &lt;strong&gt;commit&lt;/strong&gt; ou &lt;strong&gt;merge&lt;/strong&gt;.&lt;br&gt;
No lado do servidor: quando ocorre alguma operação de rede (como &lt;strong&gt;push&lt;/strong&gt;, por exemplo).&lt;/p&gt;

&lt;p&gt;Mas isso não é regra!&lt;/p&gt;

&lt;p&gt;Você pode utilizar esses Hooks para qualquer ação que julgar importante e/ou necessária :)&lt;/p&gt;

&lt;p&gt;A própria API do Git, por si só, permite a utilização desses Hooks independentemente de quais tecnologias estão sendo utilizadas no projeto.&lt;/p&gt;

&lt;p&gt;Para projetos que utilizam o ecossistema Node/Npm (seja cliente ou servidor), pode-se utilizar o &lt;a href="https://github.com/typicode/husky" rel="noopener noreferrer"&gt;Husky&lt;/a&gt; para ajudar na configuração desses Hooks.&lt;/p&gt;

&lt;p&gt;Se quiser saber um pouco mais sobre o funcionamento desses Hooks por baixo dos panos, recomendo &lt;a href="https://willianjusten.com.br/trabalhando-com-git-hooks-de-forma-facil/" rel="noopener noreferrer"&gt;este artigo&lt;/a&gt; maravilhoso do &lt;a href="https://willianjusten.com.br/about/" rel="noopener noreferrer"&gt;Willian Justen&lt;/a&gt; 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  Ta, mas o que é Husky?
&lt;/h2&gt;

&lt;p&gt;&lt;del&gt;É uma raça de cachorros peludos e fofos 🐶&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;De acordo com o &lt;a href="https://github.com/typicode/husky#readme" rel="noopener noreferrer"&gt;repositório oficial&lt;/a&gt;, Husky é uma biblioteca JavaScript que serve para previnir péssimos &lt;strong&gt;git commit&lt;/strong&gt;, &lt;strong&gt;git push&lt;/strong&gt; e mais!&lt;/p&gt;

&lt;p&gt;Através do Husky, é possível configurar os Hooks no &lt;code&gt;package.json&lt;/code&gt; do seu projeto e compartilhá-los com seu time.&lt;/p&gt;

&lt;p&gt;Fazendo da forma padrão do Git, as configurações dos Hooks ficam dentro do diretório &lt;code&gt;.git&lt;/code&gt; do projeto (que não é versionado), portanto só vai funcionar na sua máquina.&lt;/p&gt;

&lt;p&gt;Aaaaah, então é por isso que utilizamos o Husky! Eu não sabia disso 😱 Descobri enquanto lia &lt;a href="https://blog.cubos.io/melhorando-seu-workflow-com-husky-e-seus-git-hooks/" rel="noopener noreferrer"&gt;este artigo&lt;/a&gt; do &lt;a href="https://cubos.io/" rel="noopener noreferrer"&gt;Cubos.io&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A seguir, vamos ver como adicionar Hooks de &lt;strong&gt;pre-commit&lt;/strong&gt; e &lt;strong&gt;pre-push&lt;/strong&gt; com o Husky ⚡⚡&lt;/p&gt;

&lt;p&gt;Obs: para adicionar o Husky e criar os Hooks, é importante que você possua um projeto Node/Npm com um arquivo &lt;code&gt;package.json&lt;/code&gt; e o Git já inicializado :)&lt;/p&gt;




&lt;h2&gt;
  
  
  Então, bora fazer!
&lt;/h2&gt;

&lt;p&gt;A primeira a coisa a ser feita é instalar o Husky, que deve ficar nas dependências de desenvolvimento.&lt;br&gt;
Para isso, execute o seguinte comando no diretório do seu projeto:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

npm &lt;span class="nb"&gt;install &lt;/span&gt;husky &lt;span class="nt"&gt;--save-dev&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;ou&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

yarn add &lt;span class="nt"&gt;-D&lt;/span&gt; husky


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Feito isso, você vai perceber que uma linha foi adicionada nas &lt;code&gt;devDependencies&lt;/code&gt; do seu &lt;code&gt;package.json&lt;/code&gt;, conforme exibido abaixo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="nl"&gt;"devDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"husky"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.2.5"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;p&gt;Você pode ver a lista e descrição de todos os Hooks disponíveis na &lt;a href="https://git-scm.com/docs/githooks" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt; (em inglês) ou &lt;a href="https://www.hostinger.com.br/tutoriais/como-usar-git-hooks/" rel="noopener noreferrer"&gt;neste artigo&lt;/a&gt; do &lt;a href="https://www.hostinger.com.br/" rel="noopener noreferrer"&gt;Hostinger&lt;/a&gt; (em português) 😗✌️&lt;/p&gt;

&lt;p&gt;Rapidamente falando, os Hooks que usaremos são:&lt;br&gt;
&lt;code&gt;pre-commit&lt;/code&gt; =&amp;gt; é invocado quando um &lt;code&gt;git commit&lt;/code&gt; é executado, antes da escrita do commit.&lt;br&gt;
&lt;code&gt;pre-push&lt;/code&gt; =&amp;gt; é invocado quando um &lt;code&gt;git push&lt;/code&gt; é executado, antes de enviar os commits.&lt;/p&gt;

&lt;p&gt;Normalmente, esses Hooks são utilizados para rodar os &lt;code&gt;testes&lt;/code&gt; e &lt;code&gt;lint&lt;/code&gt; do projeto, então vamos pegar esses exemplos.&lt;/p&gt;




&lt;h3&gt;
  
  
  Criando o primeiro Hook com pre-commit!
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Obs: As configurações dos Hooks do Husky ficam em &lt;code&gt;husky.hooks&lt;/code&gt; no &lt;code&gt;package.json&lt;/code&gt;.
&lt;/h4&gt;

&lt;p&gt;Vamos supor que você já tenha um &lt;code&gt;script&lt;/code&gt; de &lt;code&gt;lint&lt;/code&gt; que seja executado com &lt;code&gt;npm run lint&lt;/code&gt; (ou &lt;code&gt;yarn lint&lt;/code&gt;) e deseja rodá-lo sempre que o usuário faça uma ação de &lt;strong&gt;commit&lt;/strong&gt;, permitindo ou bloqueando a escrita deste &lt;strong&gt;commit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Neste caso, basta chamar o &lt;code&gt;npm run lint&lt;/code&gt; (ou &lt;code&gt;yarn lint&lt;/code&gt;) no Hook de &lt;code&gt;pre-commit&lt;/code&gt; do Husky, conforme exemplificado abaixo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint . --ext .js,.jsx"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"devDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"husky"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.2.5"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"husky"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"pre-commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run lint"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Caso queira adicionar outro &lt;code&gt;script&lt;/code&gt; para ser executado no &lt;code&gt;pre-commit&lt;/code&gt;, basta adicioná-lo na frente do &lt;code&gt;npm run lint&lt;/code&gt; com um &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; entre eles.&lt;br&gt;
Exemplo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

  &lt;/span&gt;&lt;span class="nl"&gt;"husky"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"pre-commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run lint &amp;amp;&amp;amp; npm run test"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Prontinho! Com isso, os dois &lt;code&gt;scripts&lt;/code&gt; serão executados quando alguém tentar fazer um &lt;code&gt;commit&lt;/code&gt; no projeto 😊&lt;/p&gt;

&lt;h3&gt;
  
  
  O problema do pre-push
&lt;/h3&gt;

&lt;p&gt;Como comentado anteriormente, o &lt;code&gt;pre-push&lt;/code&gt; serve para executar um &lt;code&gt;script&lt;/code&gt; antes de alguém fazer um &lt;code&gt;push&lt;/code&gt; no projeto.&lt;/p&gt;

&lt;p&gt;Mas, pesquisando um pouco sobre o &lt;code&gt;pre-push&lt;/code&gt;, me deparei com &lt;a href="https://medium.com/faun/why-using-pre-push-git-hooks-with-husky-is-not-always-a-good-idea-6233b8afcf83" rel="noopener noreferrer"&gt;este artigo&lt;/a&gt; do &lt;a href="https://medium.com/@kacperwdowik" rel="noopener noreferrer"&gt;Kacper Wdowik&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Basicamente, ele diz que nem sempre o &lt;code&gt;pre-push&lt;/code&gt; é uma boa ideia, exemplificando isso com a execução dos testes do projeto.&lt;/p&gt;

&lt;p&gt;Acontece que, normalmente, ao rodar &lt;code&gt;npm run test&lt;/code&gt; é levado em consideração todos os arquivos modificados localmente no projeto; ou seja, considera arquivos/linhas que ainda não foram "commitados".&lt;/p&gt;

&lt;p&gt;A dor que ele sentiu foi em relação à coerência e concordância dos testes com o que está, de fato, subindo. Um caso &lt;del&gt;não tão&lt;/del&gt; incomum seria os testes passarem porque um arquivo foi corrigido mas não está nos arquivos para subir com o &lt;code&gt;push&lt;/code&gt;, o que poderia resultar em um erro em produção &lt;del&gt;numa sexta-feira à noite&lt;/del&gt;, por exemplo 👀&lt;/p&gt;

&lt;p&gt;Para resolver isso, ele fez uso da seguinte abordagem:  comparar o que está no &lt;code&gt;HEAD&lt;/code&gt; do projeto com o que está em local, permitindo que a ação de &lt;code&gt;push&lt;/code&gt; seja realizada apenas quando a pessoa realizou &lt;code&gt;commits&lt;/code&gt; de todos os arquivos modificados, garantindo que o Hook rode com os arquivos que vão, de fato, subir.&lt;/p&gt;

&lt;p&gt;Então você tem duas opções:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Permitir&lt;/strong&gt; que as pessoas desenvolvedoras façam &lt;code&gt;push&lt;/code&gt; quando alguma linha ou arquivo não esteja "commitado", sabendo que o &lt;code&gt;script&lt;/code&gt; executado no &lt;code&gt;pre-push&lt;/code&gt; &lt;strong&gt;pode não estar em concordância&lt;/strong&gt; com o que está, de fato, subido;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impedir&lt;/strong&gt; que as pessoas desenvolvedoras façam &lt;code&gt;push&lt;/code&gt; quando alguma linha ou arquivo não esteja "commitado" e ter a confiança de que o &lt;code&gt;script&lt;/code&gt; executado no &lt;code&gt;pre-push&lt;/code&gt; &lt;strong&gt;esteja em concordância&lt;/strong&gt; com o que está, de fato, subindo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Eu, pessoalmente, prefiro a segunda opção, mas isso vai de cada projeto 😊&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando o segundo Hook com pre-push
&lt;/h3&gt;

&lt;p&gt;Como comentado acima, vou seguir com a segunda abordagem, indo de acordo com o estudo do &lt;a href="https://medium.com/@kacperwdowik" rel="noopener noreferrer"&gt;Kacper Wdowik&lt;/a&gt; no artigo &lt;a href="https://medium.com/faun/why-using-pre-push-git-hooks-with-husky-is-not-always-a-good-idea-6233b8afcf83" rel="noopener noreferrer"&gt;Why using pre-push Git Hooks with Husky is not always a good idea&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ficaria algo assim:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eslint . --ext .js,.jsx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run jest"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"devDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"husky"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.2.5"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"husky"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"hooks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"pre-commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run lint"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"pre-push"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"git diff HEAD --quiet &amp;amp;&amp;amp; npm run test &amp;amp;&amp;amp; npm run lint"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Note que, no exemplo acima, o &lt;code&gt;HEAD&lt;/code&gt; está sendo comparado com a sua árvore de trabalho atual. Caso sejam iguais, continua a execução. Caso contrário, termina a execução retornando um erro.&lt;/p&gt;

&lt;p&gt;Utilizando esta abordagem, caso tente rodar um &lt;code&gt;git push&lt;/code&gt; com arquivos modificados apenas localmente (sem "commitar"), você pode se deparar com uma mensagem de erro semelhante a esta:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsex4y1se0dnzg5ipnrqm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fsex4y1se0dnzg5ipnrqm.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Caso isso aconteça, não siga a orientação dele de adicionar um &lt;code&gt;--no-verify&lt;/code&gt; ao executar o &lt;code&gt;git push&lt;/code&gt;, pois assim o Hook vai ser ignorado e seu esforço será em vão 😅&lt;br&gt;
Opte por "commitar" as modificações e refazer a operação de &lt;code&gt;push&lt;/code&gt; ou seguir pela primeira abordagem comentada lá em cima (removendo o &lt;code&gt;git diff HEAD --quiet &amp;amp;&amp;amp;&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Feito isso, seus Hooks de commit e push já vão estar funcionando para todo mundo que mexer no projeto :D&lt;/p&gt;

&lt;h2&gt;
  
  
  Concluindo
&lt;/h2&gt;

&lt;p&gt;No geral, os Git Hooks com Husky tendem a ficar mais simples e gerenciáveis, permitindo que mais de uma pessoa tenha acesso às mesmas regras.&lt;/p&gt;

&lt;p&gt;Dei exemplos simples de implementação, chamando &lt;code&gt;scripts&lt;/code&gt; já existentes no seu projeto. Mas você pode criar seus próprios &lt;code&gt;scripts&lt;/code&gt; manualmente e chamá-los nos Hooks.&lt;/p&gt;

&lt;p&gt;Pretendo falar um pouco sobre a criação de &lt;code&gt;scripts&lt;/code&gt; manualmente em um artigo futuro, focado unicamente neste ponto, que tende a ser um pouco mais complexo e deixaria este artigo muito longo xD&lt;/p&gt;

&lt;p&gt;Além do que foi falado aqui, recomendo o uso do &lt;a href="https://github.com/okonet/lint-staged" rel="noopener noreferrer"&gt;lint-staged&lt;/a&gt; para facilitar a organização e visualização dos &lt;code&gt;scripts&lt;/code&gt; de &lt;code&gt;lint&lt;/code&gt; executados nos Hooks do Husky.&lt;/p&gt;

&lt;p&gt;Se quiser saber um pouco mais sobre as vantagens de utilização do &lt;code&gt;lint-staged&lt;/code&gt;, recomendo &lt;a href="https://evellynlima.com.br/otimizando-o-pre-commit/" rel="noopener noreferrer"&gt;este artigo&lt;/a&gt; incrível da &lt;a href="https://evellynlima.com.br/" rel="noopener noreferrer"&gt;Evellyn Lima&lt;/a&gt;, onde ela fala sobre otimização do &lt;code&gt;pre-commit&lt;/code&gt; e mostra exemplos práticos com &lt;code&gt;lint-staged&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ah, lembre-se que o Git possui vários Hooks que podem ser utilizados e cabe a você decidir quais Hooks fazem sentido (ou não) para aplicar no Workflow do seu projeto 😉&lt;/p&gt;

&lt;p&gt;Qualquer dúvida, sugestão, correção, comentário etc, me procure no &lt;a href="https://twitter.com/helendiashd" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; ou no &lt;a href="https://www.linkedin.com/in/helendiashd/" rel="noopener noreferrer"&gt;Linkedin&lt;/a&gt;, que estou sempre disponível ✌️&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>husky</category>
      <category>git</category>
      <category>hooks</category>
    </item>
  </channel>
</rss>
