DEV Community

Poveda
Poveda

Posted on • Updated on

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

Top comments (0)