DEV Community

Cover image for Para que serve o comando `git send-email`?
Valdeir S.
Valdeir S.

Posted on

Para que serve o comando `git send-email`?

O GIT nasceu em um momento que era muito comum programadores e entusiastas se reunirem em comunidades e fóruns para debater e programar. Apesar de existir softwares de versionamentos como o Bitkeeper(na época pago), não existia (até onde sei) um sistema integrado ao Git (lançando em 2005) como o Github, GitLab e Bitbucket, por exemplo.

Em vez disso, alguns programadores utilizavam as trocas de e-mails para enviar correções e novos códigos, através do protocolo SMTP/IMAP, para outros desenvolvedores ou fóruns. Com isso, eles podiam compartilhar seus códigos e ajudar a comunidade.

A vantagem, na época, era a velocidade de transmissão de dados e o custo.

Como o comando funciona?

Basicamente, ele envia uma coleção de correções feitas por você para o destinatário, que vai poder mesclar as alterações utilizando o comando git-am.

O comando permite o uso de dois formatos para envio das correções:

  • Formato mbox (veremos adiante)
  • Formato criado por Greg Kroah-hartman (Use por sua conta em risco. Palavras do autor 😁)

É possível enviar anexos com o comando?

Não. Ele envia apenas texto. Caso queira enviar seu repositório por e-mail, basta usar o comando git archive (para comprimir os arquivos com zip, gzip, bzip2 ou xz) ou git bundle (para criar um arquivo compactado com todas as alterações).

Como enviar correções via e-mail?

Requisitos

Preparando envio

Antes de fazer o envio, precisamos preparar as correções utilizando o comando git-format-patch como no exemplo abaixo.

# No comando abaixo, você pode informar um <commit hash> ou <revision range>
git format-patch 0ac05bd5a72f8d4e6f2d7313689153851a4809e5

# O comando cria um arquivo por <commit>, que será nomeado com "<id>-<assunto do commit>.patch"
# 0001-Update-.bash_aliases.patch
# 0002-Create-.functions.patch
Enter fullscreen mode Exit fullscreen mode

Observação: Para incluir um arquivo, use o comando git format-patch --root -- <file>

Conteúdo dos arquivos *.patch

Ao abrir ou imprimir o conteúdo do arquivo na tela, podemos ver que ele possui os cabeçalhos de e-mail (FROM, SUBJECT, DATE) e o corpo da mensagem informando onde ocorreram as alterações.

OBS.: Os comentários iniciados com # não existem no arquivo original e foram adicionados por motivos didáticos

# Na linha abaixo temos o <commit-hash>
From 28f8dabbc894ec75a1d8bee86f9de18ad1e7ccd1 Mon Sep 17 00:00:00 2001

# Informações autor
From: Valdeir S. <contact@valdeir.dev>

# Data de criação do <commit>
Date: Sat, 20 Mar 2021 16:17:48 -0300

# Assunto do <commit> (a primeira linha dele)
Subject: [PATCH 1/3] Update .bash_aliases

# Estatísticas das alterações, que
# Apresenta a quantidade de arquivos alterados, criados e deletados
# E a quantidade de caracteres removidos e adicionados
---
 .bash_aliases | 3 ---
 1 file changed, 3 deletions(-)

# Abaixo são destacadas as diferenças entre o snapshot anterior do arquivo com o atual
diff --git a/.bash_aliases b/.bash_aliases

# Index da árvore de trabalho.
# Compare `git show 450e3a9` com `git show 1cdcd5e`
index 450e3a9..1cdcd5e 100644
--- a/.bash_aliases
+++ b/.bash_aliases

# A linha iniciada com "-" significa que a linha foi removida
# A linha iniciada com "+" significa que a linha foi adicionada
# A linha iniciada SEM "-" e SEM "+" significa que não sofreu alterações
@@ -27,9 +27,6 @@ alias myip="dig +short myip.opendns.com @resolver1.opendns.com"
 # Outros
 alias diff="git diff --no-index"

-# Comandos
-command -v calc >> /dev/null || function calc(){ awk "BEGIN{ print $* }" ;}
-
 # Finaliza todos os containers do Docker
 function dockerStopAll() {
   for c in $(docker ps | tail -n +2 | cut -d' ' -f1); do
--
2.31.1.windows.1
Enter fullscreen mode Exit fullscreen mode

Enviando alterações

Para enviar as coleções de correções por e-mail, você pode usar um serviço/servidor de SMTP.
No comando abaixo, são definidas as configurações para o envio; no entanto, elas podem ser armazenadas no arquivo de configuração ~/.gitconfig

git send-email \
  --smtp-encryption tls \
  --smtp-server smtp.mailtrap.io \
  --smtp-server-port 587 \
  --smtp-user <hash> \
  --smtp-pass <hash> \
  *.patch
Enter fullscreen mode Exit fullscreen mode

Saída do comando

# Lista de arquivos
0001-Update-.bash_aliases.patch
0002-Create-.functions.patch
0003-refactor-remove-o-arquivo-de-configura-o-do-navegado.patch
(mbox) Adding cc: Valdeir S. <contact@valdeir.dev> from line 'From: Valdeir S. <contact@valdeir.dev>'

# Cabeçalho e corpo do e-mail
From: example@valdeir.dev
To: exemplo@valdeir.dev
Cc: Valdeir S. <contact@valdeir.dev>
Subject: [PATCH 1/3] Update-.bash_aliases.patch
Date: Mon, 12 Apr 2021 23:29:20 -0300
Message-Id: <20210413022926.1198-1-example@valdeir.dev>
X-Mailer: git-send-email 2.31.1.windows.1
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit

    The Cc list above has been expanded by additional
    addresses found in the patch commit message. By default
    send-email prompts before sending whenever this occurs.
    This behavior is controlled by the sendemail.confirm
    configuration setting.

    For additional information, run 'git send-email --help'.
    To retain the current behavior, but squelch this message,
    run 'git config --global sendemail.confirm auto'.

Send this email? ([y]es|[n]o|[e]dit|[q]uit|[a]ll):

Caso queira enviar as alterações, pressione y ou a; e, ENTER

Para que serve o comando format-patch

Ele é o responsável por preparar os arquivos para cada commit, já com os cabeçalhos necessários e o a saída do comando git diff <commit B>..<commit A>.

O que é MBOX?

De acordo com a documentação do FreeBSD, o MBOX é "um arquivo de texto que contém um número arbitrário de mensagens de e-mail. Cada mensagem consiste em um carimbo do correio, seguido por uma mensagem de e-mail formatado de acordo com RFC822 e RFC2822. As linhas são separadas por caracteres de alimentação de linha (ASCII 10)."

Alguém, em sã consciência, usa isso?

Esta é a única forma de contribuir com alguns projetos como o kernel do Linux ou o próprio GIT.

Caso alguém tenha interesse em contribuir com o Kernel ou apenas queira saber como o fazer, basta acessar a página enviando correções: o guia essencial para colocar seu código no kernel

Exemplo de configuração no arquivo ~/.gitconfig

[sendemail]
    smtpEncryption = tls
    smtpServer = smtp.gmail.com
    smtpUser = you@email.com
    smtpServerPort = 587
    smtpPass = Your-pass (Não é recomendável)
    confirm = auto
    replyTo = reply@email.com
Enter fullscreen mode Exit fullscreen mode

Alternativa

Desde a versão v1.3.0-rc1, o GIT disponibiliza a ferramenta git-imap-send. As diferenças são:

imap-send

  • Envia as alterações para seu programa/provedor de e-mail e salva como rascunho (é possível configurar outra pasta)
  • Envia alterações recebidas pela entrada (STDIN) e geradas pelo format-patch
  • Comando: git format-patch --stdout --attach origin <hash> | git imap-send

send-email

  • Envia as alterações para o destinatário
  • Envia alterações dos arquivos gerados pelo format-patch
  • Comando: git format-patch -o patches/ <hash> && git send-email patches/*

Referências

Top comments (0)