DEV Community

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

Posted on

3 2

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

Speedy emails, satisfied customers

Postmark Image

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