---
id: repository-cleanup
agent: devops
title: Limpar o repositório — branches e artefatos obsoletos
inputs: [repositório, objetivo de limpeza]
outputs: [branches removidas, artefatos removidos, relatório de limpeza]
elicit: true
modes: [interactive]
---

# Limpar o repositório — branches e artefatos obsoletos

**Objetivo:** identificar branches já mergeadas, branches velhas e artefatos obsoletos, apresentá-los
ao usuário e remover apenas o que ele aprovar — mantendo o repositório limpo sem nunca apagar trabalho
vivo.

**Pré-condições:**
- O diretório é um repositório git com remoto detectável. Se for greenfield (sem git), **pare** e
  recomende `*environment-bootstrap` antes de qualquer limpeza.
- A árvore de trabalho está limpa (sem mudanças não-commitadas que possam se perder). Se houver
  pendências, **pare** e peça para o @dev commitar ou stashar antes.

## Passos

1. **Detecto o contexto do repositório.** Remoto, branch atual e branch protegida (`main`/`master`).
   Nunca assumo um repo fixo — detecto dinamicamente.
2. **Atualizo o estado remoto** com `git fetch --all --prune`, para que branches já deletadas no
   remoto não apareçam como vivas localmente.
3. **Classifico os candidatos** em três grupos, sem apagar nada ainda:
   a. **branches locais já mergeadas** na protegida (`git branch --merged`), exceto a protegida e a atual;
   b. **branches stale** (sem commits há um limite que confirmo com o usuário, ex.: 30 dias);
   c. **artefatos obsoletos** (build, caches, logs) que rastreiam a uma story/objetivo de limpeza —
      nunca arquivos de escopo desconhecido.
4. **PONTO DE ELICITAÇÃO — apresento a lista e espero o "ok".** Mostro cada candidato com o motivo
   (mergeada / stale / artefato) e o destino (local, remoto ou ambos). **Não removo nada sem a
   aprovação explícita do usuário** — delete é destrutivo e pede confirmação humana.
5. **Removo só o aprovado.** Branch local: `git branch -d` (nunca `-D` sem aprovação extra, pois `-d`
   recusa branch não-mergeada como salvaguarda). Branch remota: `git push origin --delete {branch}` —
   essa é operação de remoto, **exclusiva minha** (@devops). Artefatos: removo do disco e, se
   versionados por engano, do índice.
6. **NUNCA toco na protegida.** `main`/`master` jamais entra na lista de delete — nem local, nem remota.
7. **Reporto e deixo o rollback claro.** Listo o que foi removido. Branch local recém-deletada é
   recuperável pelo `reflog`; informo o SHA de cada branch removida para que o usuário possa
   restaurá-la (`git branch {nome} {sha}`) se precisar.

## Critério de pronto (DoD)

- [ ] `git fetch --prune` executado; estado remoto sincronizado
- [ ] Candidatos classificados (mergeadas / stale / artefatos) e apresentados ao usuário
- [ ] Apenas itens explicitamente aprovados foram removidos
- [ ] Branch protegida (`main`/`master`) intocada
- [ ] Relatório de limpeza entregue com os SHAs para rollback

## Falha / recuperação

- **Usuário não aprova nenhum item** → encerro sem remover nada; limpeza é opcional, não obrigatória.
- **Branch parece mergeada mas o `-d` recusa** → respeito a salvaguarda, sinalizo ao usuário e só uso
  `-D` com aprovação explícita extra — não forço delete de trabalho não-integrado.
- **Delete de branch remota falha** (permissão/branch protegida no GitHub) → reporto o erro, não
  insisto, e deixo a branch como estava.
- **Item removido por engano** → recupero via `reflog`/SHA registrado no relatório antes de encerrar.
