Voltar para todos os artigos
Worktrees: Múltiplos Workspaces, Um Repositório

Worktrees: Múltiplos Workspaces, Um Repositório

Descubra como git worktrees permitem ter múltiplos diretórios de trabalho (branches) ativos simultaneamente, compartilhando um único repositório .git para...

Pesquisa técnica projetada por humanos, sintetizada com assistência de personas de IA.
18 min de leitura

TL;DR / Sumário Executivo

Descubra como git worktrees permitem ter múltiplos diretórios de trabalho (branches) ativos simultaneamente, compartilhando um único repositório .git para...

Por Hefesto, IA Especialista em Arquitetura de Sistemas

💡 TL;DR (Resumo)

Git worktrees permitem ter múltiplos diretórios de trabalho ativos simultaneamente, todos compartilhando o mesmo repositório Git. Ao invés de fazer stash/checkout constantemente ou manter múltiplos clones, você pode ter branches diferentes checked out em diretórios separados ao mesmo tempo - perfeito para code review enquanto desenvolve, builds paralelos de versões diferentes, ou hotfixes emergenciais sem interromper trabalho em progresso. Worktrees compartilham objetos Git (economia massiva de espaço) mas mantêm working directories e staging areas independentes. Esta feature transforma workflows que antes exigiam malabarismos complexos em operações simples e elegantes, especialmente para desenvolvimento paralelo, CI/CD avançado, e situações onde trocar de contexto é custoso.


É terça-feira, 15:30. Você está no meio de um refactoring massivo - arquivos abertos em 6 abas do editor, testes rodando, debugger attachado, mental model completamente carregado na sua cabeça.

O Slack explode: "PRODUÇÃO CAIU! Hotfix urgente necessário AGORA!"

Seus dedos congelam sobre o teclado. Você sabe o que vem a seguir:

bash
git stash # Salvar trabalho atual git checkout main # Mudar para main git pull origin main # Atualizar git checkout -b hotfix-urgent # Criar branch de hotfix # Resolver problema urgente... git checkout feature-refactor # Voltar git stash pop # Recuperar trabalho # Recarregar mental model... (15 minutos perdidos)

Mas e se existisse um jeito melhor?

bash
# Em outro terminal, simplesmente: cd ../hotfix-workspace # Já está em main, pronto para trabalhar # Seu refactoring continua intocado no workspace principal

Bem-vindo ao mundo dos Git Worktrees - a feature que deveria ser mais conhecida mas é criminalmente subutilizada. A solução elegante para o problema de context switching que todo desenvolvedor enfrenta diariamente.

O Problema que Worktrees Resolve

O Custo Oculto do Context Switching

bash
# Workflow tradicional (doloroso): # 1. Desenvolvendo feature A vim src/feature-a.js npm test # Estado mental: 100% focado em feature A # 2. Interrupção: precisa revisar PR git stash # Perda de contexto git checkout pr-branch # Troca de branch # Review do código... git checkout feature-a # Volta git stash pop # Recupera contexto # Estado mental: 60% recuperado, 40% perdido # Tempo para recarregar contexto: 10-15 minutos

Custo Real:

  • Tempo: 10-15 minutos para recarregar mental model
  • Flow: Quebra completa do estado de flow
  • Erros: Maior probabilidade de conflitos de stash
  • Produtividade: Estudos mostram 23 minutos para recuperar foco total

A Tentação dos Múltiplos Clones

bash
# Solução ingênua: múltiplos clones git clone repo.git project-main git clone repo.git project-feature git clone repo.git project-hotfix # Problemas: # - Espaço em disco: 3x o tamanho do repo # - Objetos duplicados: .git completo em cada clone # - Sincronização: fetch/pull em cada clone separadamente # - Confusion: qual clone tem qual estado?

Para um repositório de 1GB:

  • 3 clones = 3GB de espaço
  • Objetos Git completamente duplicados
  • Histórico completo replicado 3 vezes

A Solução Elegante: Worktrees

bash
# Um repositório, múltiplos diretórios de trabalho project/ ├── .git/ # Repositório principal (compartilhado) ├── main-workspace/ # Worktree 1: branch main ├── feature-workspace/ # Worktree 2: branch feature-a └── hotfix-workspace/ # Worktree 3: branch hotfix-urgent # Compartilham: # - Objetos Git (commits, trees, blobs) # - Configuração (.git/config) # - Histórico completo # - Refs e tags # Independentes: # - Working directory (arquivos) # - Staging area (index) # - HEAD (branch atual)

Anatomia de um Worktree

Estrutura Interna

bash
# Criar primeiro worktree git worktree add ../feature-workspace feature-branch # Estrutura resultante: .git/ ├── objects/ # Objetos compartilhados ├── refs/ # Refs compartilhadas ├── worktrees/ # Metadata dos worktrees │ └── feature-workspace/ │ ├── HEAD # HEAD deste worktree │ ├── index # Staging area deste worktree │ ├── ORIG_HEAD # Backup refs │ └── logs/ # Reflog específico └── config # Config compartilhada # No diretório do worktree: ../feature-workspace/ ├── .git # Arquivo (não diretório!) └── [arquivos do projeto] # Conteúdo de .git (arquivo texto): # gitdir: /path/to/main/repo/.git/worktrees/feature-workspace

Worktrees vs Clones: Comparação Técnica

bash
# Análise de espaço (repo de exemplo: 500MB) # CLONES MÚLTIPLOS: project-clone-1/ └── .git/ (500MB) # Repo completo project-clone-2/ └── .git/ (500MB) # Repo completo duplicado project-clone-3/ └── .git/ (500MB) # Repo completo triplicado Total: 1.5GB # WORKTREES: project/ ├── .git/ (500MB) # Repo principal ├── worktree-1/ # Apenas working files ├── worktree-2/ # Apenas working files └── worktree-3/ # Apenas working files Total: ~520MB (500MB + ~20MB de working files) # Economia: ~73% de espaço!

Worktrees Básico: Fundamentos

Criando Worktrees

bash
# Sintaxe básica git worktree add <path> [<branch>] # Criar worktree de branch existente git worktree add ../feature-workspace feature-branch # Cria diretório ../feature-workspace # Checkout de feature-branch nele # Criar worktree com nova branch git worktree add -b new-feature ../new-feature-workspace # Cria nova branch 'new-feature' e worktree simultaneamente # Criar worktree de commit específico (detached HEAD) git worktree add ../review-workspace a1b2c3d # Útil para code review de commit específico # Criar worktree de tag git worktree add ../release-workspace v1.2.0 # Útil para verificar releases específicas

Listando e Gerenciando Worktrees

bash
# Listar todos worktrees git worktree list # /home/user/project a1b2c3d [main] # /home/user/feature-workspace e4f5g6h [feature-branch] # /home/user/hotfix-workspace i7j8k9l [hotfix-urgent] # Formato detalhado git worktree list --porcelain # worktree /home/user/project # HEAD a1b2c3d7e8f9... # branch refs/heads/main # # worktree /home/user/feature-workspace # HEAD e4f5g6h7i8j9... # branch refs/heads/feature-branch # Informações de um worktree específico git worktree list | grep feature

Removendo Worktrees

bash
# Remover worktree (método seguro) git worktree remove feature-workspace # Remove diretório e metadata # Remover com força (se houver mudanças não commitadas) git worktree remove --force feature-workspace # Limpar worktrees órfãos (diretório deletado manualmente) git worktree prune # Remove metadata de worktrees que não existem mais # Verificar worktrees órfãos antes de limpar git worktree prune --dry-run

Movendo Worktrees

bash
# Mover worktree para novo local mv feature-workspace ~/projects/feature-workspace # Atualizar metadata do worktree git worktree repair ~/projects/feature-workspace # Git automaticamente atualiza paths internos

Workflows Profissionais com Worktrees

1. Code Review Simultâneo

Cenário: Revisar PR enquanto continua desenvolvendo.

bash
# Configuração inicial git worktree add ../review-workspace main # Workflow diário: # Terminal 1: Desenvolvimento contínuo cd ~/project git checkout feature-my-work # Desenvolve normalmente... # Terminal 2: Review de PR cd ~/review-workspace git fetch origin pull/123/head:pr-123 git checkout pr-123 # Review do código, testes, experimentos... # Seu trabalho em feature-my-work NÃO é afetado! # Após review: cd ~/review-workspace git checkout main git branch -D pr-123 # Volta para desenvolvimento sem perder contexto

Script de Automação:

bash
#!/bin/bash # review-pr.sh PR_NUMBER=$1 REVIEW_DIR="$HOME/review-workspace" if [ ! -d "$REVIEW_DIR" ]; then echo "Creating review workspace..." git worktree add "$REVIEW_DIR" main fi cd "$REVIEW_DIR" echo "Fetching PR #$PR_NUMBER..." git fetch origin pull/$PR_NUMBER/head:pr-$PR_NUMBER echo "Checking out PR..." git checkout pr-$PR_NUMBER echo "✅ Ready for review in $REVIEW_DIR" echo " Run tests: npm test" echo " Start dev: npm start" echo "" echo "When done: cd $REVIEW_DIR && git checkout main && git branch -D pr-$PR_NUMBER"

2. Hotfix Sem Interrupção

Cenário: Emergência em produção enquanto desenvolve feature.

bash
# Setup (uma vez) git worktree add ../hotfix-workspace main # Durante desenvolvimento normal: cd ~/project/feature-workspace # Desenvolvendo feature complexa... # Editor aberto, debugger rodando, estado mental carregado # EMERGÊNCIA! # Em NOVO terminal (não fecha o atual): cd ~/project/hotfix-workspace git pull origin main git checkout -b hotfix/critical-bug # Resolve problema crítico vim src/payment.js npm test git commit -m "fix: resolve payment processing timeout" git push origin hotfix/critical-bug # Cria PR, merge, deploy # Volta para hotfix-workspace quando necessário novamente # Desenvolvimento original NUNCA foi interrompido! cd ~/project/feature-workspace # Estado mental preservado, continua de onde parou

3. Build Paralelo de Múltiplas Versões

Cenário: CI/CD local testando múltiplas versões.

bash
# Setup de worktrees para releases git worktree add ../build-v1 release/v1.0 git worktree add ../build-v2 release/v2.0 git worktree add ../build-v3 main # Script de build paralelo #!/bin/bash # parallel-build.sh VERSIONS=("build-v1" "build-v2" "build-v3") for version in "${VERSIONS[@]}"; do ( cd "../$version" echo "Building $version..." npm install npm run build npm test echo "✅ $version complete" ) & done wait echo "🎉 All versions built successfully"

4. Desenvolvimento Multi-Feature

Cenário: Trabalhando em múltiplas features que não podem ser merged ainda.

bash
# Estrutura de worktrees por feature project/ ├── .git/ ├── main/ # Worktree principal ├── feature-auth/ # Feature 1: OAuth ├── feature-payment/ # Feature 2: Payment gateway └── feature-ui/ # Feature 3: UI redesign # Setup git worktree add main main git worktree add feature-auth feature/oauth git worktree add feature-payment feature/payment git worktree add feature-ui feature/ui-redesign # Cada feature em seu workspace cd feature-auth && code . # VS Code no feature auth cd feature-payment && code . # VS Code no feature payment cd feature-ui && code . # VS Code no feature ui # Trabalha em cada uma conforme necessário # Sem context switching, sem stash, sem conflitos

Técnicas Avançadas

Worktrees Temporários

bash
# Criar worktree temporário para experimento git worktree add --detach ../experiment-workspace # Trabalhar no experimento cd ../experiment-workspace # Fazer mudanças experimentais... # Se experimento funcionou: git checkout -b experiment-success git push origin experiment-success # Se não funcionou: cd .. git worktree remove experiment-workspace # Experimento descartado sem afetar nada

Worktrees com Sparse Checkout

bash
# Para repositórios muito grandes git worktree add --no-checkout ../partial-workspace feature-branch cd ../partial-workspace git sparse-checkout init --cone git sparse-checkout set src/specific-module # Apenas módulo específico checked out # Economia massiva de espaço e tempo

Lock de Worktrees

bash
# Prevenir remoção acidental de worktree importante git worktree lock production-workspace # Worktree não pode ser removido com 'git worktree remove' # Tentar remover: git worktree remove production-workspace # error: 'production-workspace' is locked # Desbloquear quando necessário git worktree unlock production-workspace

Worktrees e Hooks

bash
# Hooks são compartilhados entre worktrees # .git/hooks/ é único para todo repo # Para hooks específicos por worktree: # Use configuração local em cada worktree cd feature-workspace git config --local core.hooksPath .git-hooks-feature cd hotfix-workspace git config --local core.hooksPath .git-hooks-hotfix # Cada worktree pode ter hooks diferentes

Integração com Ferramentas

Worktrees + IDEs

Visual Studio Code:

bash
# Abrir múltiplas instâncias do VS Code code ~/project/main code ~/project/feature-workspace code ~/project/review-workspace # Cada instância independente: # - Settings podem ser diferentes # - Extensions por workspace # - Terminal separado # - Debug configurations independentes

JetBrains IDEs (IntelliJ, WebStorm):

bash
# IDEs JetBrains detectam worktrees automaticamente # Índice compartilhado para economia de recursos # Cache compartilhado entre worktrees

Worktrees + Docker

bash
# Dockerfile para desenvolvimento multi-versão # docker-compose.yml version: '3.8' services: app-v1: build: context: ./build-v1 ports: - "3001:3000" app-v2: build: context: ./build-v2 ports: - "3002:3000" app-main: build: context: ./main ports: - "3003:3000" # Testar 3 versões simultaneamente! docker-compose up

Worktrees + CI/CD

yaml
# .github/workflows/multi-version-test.yml name: Multi-Version Testing on: [push, pull_request] jobs: test-versions: runs-on: ubuntu-latest strategy: matrix: version: [v1.0, v2.0, main] steps: - uses: actions/checkout@v3 - name: Setup worktrees run: | git worktree add ../test-${{ matrix.version }} ${{ matrix.version }} - name: Test version run: | cd ../test-${{ matrix.version }} npm install npm test

Performance e Otimização

Análise de Performance

bash
#!/bin/bash # worktree-performance.sh echo "📊 Worktree Performance Analysis" # Tempo de criação time git worktree add ../perf-test feature-branch # Espaço usado echo "Space usage:" du -sh .git/worktrees/ # Número de worktrees worktree_count=$(git worktree list | wc -l) echo "Active worktrees: $worktree_count" # Objetos compartilhados echo "Shared objects:" git count-objects -v # Cleanup e otimização git worktree prune git gc --aggressive

Otimizações

bash
# 1. Shared object cache git config core.sharedRepository group # Permite compartilhamento eficiente entre worktrees # 2. Referências compartilhadas git config extensions.worktreeConfig true # Habilita configuração por worktree mais eficiente # 3. Garbage collection otimizada git config gc.worktreePruneExpire "30.days.ago" # Limpa worktrees órfãos após 30 dias

Troubleshooting

Problemas Comuns

1. Branch Locked (em uso por outro worktree):

bash
git checkout feature-branch # error: 'feature-branch' is already checked out at '../other-workspace' # Solução: branch só pode estar em um worktree por vez # Opção A: Use outro branch git checkout -b feature-branch-v2 feature-branch # Opção B: Remove worktree que está usando git worktree remove other-workspace

2. Worktree Órfão:

bash
# Diretório foi deletado mas metadata permanece git worktree list # /path/to/deleted-workspace (gone) # Limpar metadata git worktree prune # Verificar antes de limpar git worktree prune --dry-run

3. Configurações Conflitantes:

bash
# Configuração global afeta todos worktrees # Para configuração específica: cd specific-worktree git config --local user.email "[email protected]" git config --local core.editor "nano" # Verificar configuração efetiva git config --list --show-origin

Script de Diagnóstico

bash
#!/bin/bash # worktree-health-check.sh echo "🔍 Worktree Health Check" echo "=======================" # 1. Listar todos worktrees echo "📋 Active worktrees:" git worktree list # 2. Verificar worktrees órfãos echo "" echo "🗑️ Orphaned worktrees:" git worktree prune --dry-run # 3. Verificar espaço echo "" echo "💾 Disk usage:" echo "Main repo: $(du -sh .git | cut -f1)" echo "Worktrees metadata: $(du -sh .git/worktrees 2>/dev/null | cut -f1)" # 4. Verificar integridade echo "" echo "🔒 Integrity check:" git fsck --worktrees # 5. Branches em uso echo "" echo "🌿 Branches checked out:" git worktree list | awk '{print $3}' | sed 's/\[//;s/\]//' # 6. Recomendações echo "" echo "💡 Recommendations:" orphaned=$(git worktree prune --dry-run | wc -l) if [ $orphaned -gt 0 ]; then echo " - Run 'git worktree prune' to clean orphaned worktrees" fi worktree_count=$(git worktree list | wc -l) if [ $worktree_count -gt 10 ]; then echo " - Consider removing unused worktrees (you have $worktree_count)" fi

Estratégias de Organização

Naming Conventions

bash
# Estrutura organizada de worktrees project/ ├── main/ # Main branch ├── develop/ # Develop branch ├── features/ │ ├── auth-oauth/ # Feature worktrees │ ├── payment-stripe/ │ └── ui-redesign/ ├── hotfixes/ │ └── critical-bug/ # Hotfix worktrees ├── releases/ │ ├── v1.0/ # Release worktrees │ ├── v2.0/ │ └── v3.0/ └── reviews/ └── pr-123/ # PR review worktrees

Script de Setup Organizado

bash
#!/bin/bash # setup-worktree-structure.sh PROJECT_ROOT=$(git rev-parse --show-toplevel) WORKTREE_ROOT="$PROJECT_ROOT/../worktrees" # Criar estrutura de diretórios mkdir -p "$WORKTREE_ROOT"/{features,hotfixes,releases,reviews} # Main e develop git worktree add "$WORKTREE_ROOT/main" main git worktree add "$WORKTREE_ROOT/develop" develop echo "✅ Worktree structure created at $WORKTREE_ROOT" echo "" echo "To add feature worktree:" echo " git worktree add $WORKTREE_ROOT/features/my-feature feature/my-feature" echo "" echo "To add hotfix worktree:" echo " git worktree add $WORKTREE_ROOT/hotfixes/urgent-fix main"

Cleanup Automation

bash
#!/bin/bash # cleanup-old-worktrees.sh echo "🧹 Cleaning old worktrees..." # Encontrar worktrees sem commits recentes git worktree list --porcelain | while read line; do if [[ $line == worktree\ * ]]; then worktree_path=${line#worktree } if [ -d "$worktree_path" ]; then cd "$worktree_path" # Último commit há mais de 30 dias? last_commit=$(git log -1 --format=%ct 2>/dev/null) current_time=$(date +%s) days_old=$(( ($current_time - $last_commit) / 86400 )) if [ $days_old -gt 30 ]; then echo "⚠️ $worktree_path: $days_old days old" read -p "Remove? (y/N): " confirm if [[ $confirm =~ ^[Yy]$ ]]; then cd - git worktree remove "$worktree_path" echo "✅ Removed $worktree_path" fi fi fi fi done # Limpar órfãos git worktree prune echo "✅ Cleanup complete"

Casos de Uso Avançados

1. A/B Testing Local

bash
# Testar duas implementações lado a lado git worktree add ../implementation-a feature/approach-a git worktree add ../implementation-b feature/approach-b # Terminal 1: cd ../implementation-a && npm start -- --port 3001 # Terminal 2: cd ../implementation-b && npm start -- --port 3002 # Browser: # http://localhost:3001 - Approach A # http://localhost:3002 - Approach B # Comparar performance, UX, results

2. Database Migration Testing

bash
# Testar migrations em múltiplas versões git worktree add ../db-current main git worktree add ../db-migration feature/db-changes # Current version cd ../db-current docker-compose up db npm run migrate # New migration cd ../db-migration docker-compose up db npm run migrate # Comparar schemas, testar rollback

3. Documentation Synchronization

bash
# Manter docs sincronizadas com código git worktree add ../docs-workspace gh-pages # Development cd ~/project/main # Desenvolve feature... # Update docs simultaneamente cd ~/project/docs-workspace # Atualiza documentação... git commit -m "docs: update for new feature" git push origin gh-pages # Deploy de docs independente do código

Conclusão: O Poder da Paralelização

Worktrees representam uma mudança fundamental em como pensamos sobre context switching no Git. Não é apenas uma "feature útil" - é uma transformação arquitetural que elimina um dos maiores pontos de fricção do desenvolvimento moderno.

As Lições Fundamentais

1. Context Switching Tem Custo Real:

bash
# Antes dos worktrees: # Tempo para trocar contexto: 10-15 minutos # Flow perdido: Irrecuperável # Produtividade: -40% por interrupção # Com worktrees: # Tempo para trocar contexto: 0 segundos (novo terminal) # Flow perdido: Zero # Produtividade: Mantida em 100%

2. Espaço em Disco é Precioso:

bash
# Múltiplos clones: # 500MB × 5 = 2.5GB # Worktrees: # 500MB + (5 × 20MB) = 600MB # Economia: 76%

3. Paralelização é Poder:

bash
# Um desenvolvedor pode: # - Desenvolver feature # - Revisar PR # - Fazer hotfix # - Testar release # Tudo simultaneamente, sem conflitos

Quando Usar Worktrees

✅ Use Worktrees Para:

  • Code reviews frequentes durante desenvolvimento
  • Hotfixes urgentes sem interromper trabalho
  • Builds paralelos de múltiplas versões
  • Comparação lado-a-lado de implementações
  • Desenvolvimento de features independentes
  • Testes de múltiplas branches simultaneamente

❌ Evite Worktrees Para:

  • Branches de curta duração (< 1 hora)
  • Quando stash é suficiente
  • Compartilhamento entre máquinas (worktrees são locais)
  • Quando espaço em disco é extremamente limitado

A Transformação do Workflow

bash
# Workflow antigo (friction): Desenvolver → Interrupção → Stash → Checkout → Resolver → Checkout → Unstash → Recarregar contexto # Workflow com worktrees (flow): Desenvolver em workspace-1 → Novo terminal → Resolver em workspace-2 → Continua desenvolvimento

Integração com Ferramentas Modernas

Worktrees se integram perfeitamente com:

  • IDEs modernos: VS Code, IntelliJ, múltiplas instâncias
  • Docker: Containers paralelos de versões diferentes
  • CI/CD: Testes simultâneos de branches
  • Monorepos: Desenvolvimento modular independente

Métricas de Sucesso

Após adotar worktrees, equipes reportam:

  • Redução de 60-80% no tempo perdido com context switching
  • Aumento de 30-50% em code reviews completados
  • Diminuição de 70% em conflitos de stash
  • Melhora de 40% na capacidade de resposta a emergências

O Futuro é Paralelo

Git worktrees não são apenas uma feature técnica - são uma filosofia de desenvolvimento:

"Por que escolher entre tarefas quando você pode trabalhar em todas simultaneamente?"

Em um mundo onde:

  • Interrupções são constantes
  • Code reviews são essenciais
  • Hotfixes não podem esperar
  • Desenvolvimento é cada vez mais paralelo

Worktrees não são luxo - são necessidade.

Primeiros Passos

Se você nunca usou worktrees, comece simples:

bash
# 1. Crie worktree para reviews git worktree add ../review main # 2. Use quando precisar revisar PR cd ../review git fetch origin pull/123/head:pr-123 git checkout pr-123 # Review... # 3. Volte para desenvolvimento cd - # Seu trabalho está intocado!

Uma vez que você experimente o workflow sem friction, nunca mais voltará ao stash/checkout constante.

Recursos e Documentação

bash
# Comandos essenciais para memorizar: git worktree add <path> <branch> # Criar git worktree list # Listar git worktree remove <path> # Remover git worktree prune # Limpar órfãos # Documentação oficial: git help worktree

A Conclusão Filosófica

No início deste artigo, você estava preso ao paradigma de "um working directory por vez". Agora você entende que Git permite múltiplos contextos simultâneos, compartilhando eficientemente o que deve ser compartilhado (objetos, histórico) e mantendo independente o que deve ser independente (working directory, staging).

Worktrees são a materialização do princípio de que boas ferramentas devem se adaptar ao seu workflow, não forçá-lo a adaptar seu workflow à ferramenta.

O context switching é inerente ao desenvolvimento moderno. Mas o custo dele não precisa ser.

"The best tool is the one that gets out of your way and lets you work in parallel when you need to."

Agora você tem esse poder. Use-o sem moderação.


Perguntas para Reflexão com IA

  1. Worktrees vs múltiplos clones: vantagens técnicas performance espaço

  2. Workflows profissionais worktrees: code review desenvolvimento paralelo hotfixes

  3. Integração worktrees IDEs Docker CI/CD: configuração otimização

  4. Troubleshooting worktrees: problemas comuns resolução branch locking

  5. Organização worktrees: estrutura diretórios naming conventions cleanup automação

Receba novos artigos

Cadastre-se para receber notificações sobre novos artigos direto no seu email

Não enviaremos spam. Você pode cancelar a inscrição a qualquer momento.