DEV Community

Poveda
Poveda

Posted on • Edited on

6

Git patch: Compartilhamento de commits além do remote

Certa feita passei por uma situação corriqueira: Fiquei sem acesso ao repositório do projeto da equipe. Até aí nada de extraordinário, imagino que todos os devs que estão lendo isso já passaram por isso. O problema real era que eu precisava entregar uma tarefa urgente que iria para produção assim que ela estivesse revisada pelos meus pares (aquele pr básico).
Após passar o pânico inicial e solicitar novamente os acessos, comecei a pensar como poderia fazer esse commit sem precisar encaminhar todos os arquivos alterados para alguém que tivesse acesso ao repositório e pudesse subir o trabalho feito. Relembrando minha época de estudo mais aprofundado do git (leiam o livro oficial do git), lembrei que o kernel do Linux é versionado a partir de arquivos de commits, ou patch files, e enviados por e-mail para serem revisados e restaurados no repositório principal (que não possui acesso a partir da internet). Uma vez que a linha de raciocínio estava feita, fui para a documentação oficial pensando:

Isso vai dar trabalho

Qual foi a minha surpresa ao descobrir que bastam 2 comandos para fazer tal operação.

Gerando os arquivos

O primeiro comando que deve ser rodado é o git format-patch. Ele é responsável por gerar os arquivos .patch. Cada commit irá gerar um arquivo .patch.

git format-patch -<n> -o <diretorio-de-destino-arquivo> <hash-commit>
Enter fullscreen mode Exit fullscreen mode

Explicando rápidamente cada parâmetro:

  • -<n>: A quantidade de commits anteriores ao commit informado que devem ser exportados.
  • <hash-commit>: Representa o último commit que deve ser exportado. Commits acima dele não serão exportados.
  • -o <diretorio-de-destino-arquivo> (opcional): Utilizado para informar onde o arquivo .patch deve ser salvo. O padrão é no próprio diretório.

Inserindo os arquivos .patch na árvore de commits

Agora que os arquivos .patch foram gerados, o próximo passo é adicioná-los à árvore de commits. Para isso utilizamos o comando git am

git am patch-commits/0001-Adiconadas-mais-motoriza-es-a-base.patch
Enter fullscreen mode Exit fullscreen mode

Se for mais de um arquivo

git am patch-commits/000*.patch
Enter fullscreen mode Exit fullscreen mode

Caso seja necessário revisar o arquivo de patch antes de aplicálo na árvore basta adicionar a opção -i:

git am -i patch-commits/000*.patch
Enter fullscreen mode Exit fullscreen mode

Assim, cada arquivo de patch vai ser exibido da seguinte forma:

Commit Body is:
--------------------------
Instrucoes de como rodar o mongo
--------------------------
Apply? [y]es/[n]o/[e]dit/[v]iew patch/[a]ccept all: 
Enter fullscreen mode Exit fullscreen mode

Impressões e Conclusão

É interessante ver como determinadas coisas que estudamos e não damos importância podem nos salvar algum dia. Quando li sobre o assunto de commits sendo enviados por e-mail achei cômico como o kernel do sistema operacional mais utilizado do mundo era versionado.No entanto, foi uma informação que se provou útil no final das contas.
Muitas vezes uma informação não vai ser a resolução do problema, mas é ela quem dará a linha de raciocínio para a solução.

No github (pasta patch-commits) deixei o passo a passo de como reproduzir esse post.

Enquanto revisava o material para este post me deparei com uma dúvida:

E se eu não quiser aplicar os commits diretamente na árvore, mas quiser colocá-los em stage e revisar o código em uma ferramenta mais amigável que o console?

Essa dúvida vou responder no próximo post ;)

Referências

https://git-scm.com/docs/git-format-patch
https://git-scm.com/docs/git-am

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay