Copiou código de um repositório público? Como não herdar bug sem correção
Antes de colar um módulo de projeto público no seu sistema, leia a licença, fixe o commit de origem, registre suas alterações e monte uma rotina para trazer as correções do original.
Em 2025, a equipe de sistemas de uma prefeitura copiou o módulo de numeração de documentos de um projeto público de gestão documental. Baixou o zip, colou numa pasta, ajustou três arquivos e seguiu a vida. Em 2026, o projeto original publicou uma correção de segurança justamente nesse módulo. A equipe soube por acaso, num grupo de mensagens. Ao tentar aplicar a correção, descobriu que não sabia de qual versão tinha copiado, nem o que tinha mudado.
A resposta curta: código público copiado vira código seu, com o custo de manutenção junto. Antes de colar, leia a licença. Ao colar, registre o commit exato de origem e mantenha suas alterações separadas e documentadas. Depois, tenha uma rotina para olhar o que mudou no original e trazer as correções. Se não dá para fazer isso, assuma o fork por inteiro, com testes e responsável, em vez de fingir que é uma dependência.
Por que "é público" engana
Repositório público tem três coisas que o zip não traz: licença, histórico e uma comunidade que corrige. A licença diz o que você pode fazer com o código. O histórico diz de onde cada linha veio. A comunidade publica correções que só chegam a quem acompanha. Quando você copia o conteúdo sem esse contexto, fica com o código de um dia específico, congelado, e todas as correções futuras passam a ser trabalho seu.
Público também não significa suporte. A equipe do projeto não sabe que você existe e não tem obrigação de avisar. Abrir chamado de serviço no repositório não funciona, como explica organização pública no GitHub não é canal de chamado. E dado público tem as próprias regras, assunto de API de dados públicos tem licença.
Licença: o primeiro arquivo que você abre
Abra o arquivo LICENSE (ou COPYING) na raiz do projeto antes de copiar qualquer linha. Se ele não existir, o código não vem com permissão de uso, mesmo estando visível. As licenças se dividem em dois grandes grupos:
- Permissivas, como MIT e Apache 2.0: permitem usar e modificar dentro de sistema fechado, pedindo basicamente que você mantenha o aviso de copyright e o texto da licença. A Apache 2.0 também pede que arquivos modificados indiquem a modificação.
- Copyleft, como GPL e AGPL: quem distribui um trabalho derivado pode ter de disponibilizar o código desse trabalho sob a mesma licença. A AGPL estende essa obrigação a quem oferece o sistema para uso pela rede, o que pega em cheio sistemas web.
O enquadramento exato do seu caso depende de como o código é combinado e distribuído. Isto não substitui a análise de um profissional habilitado: se a licença for copyleft e o seu sistema for fechado ou vendido, leve a dúvida ao jurídico antes de colar.
Como trazer o código do jeito certo, passo a passo
- Prefira usar a dependência como dependência. Se o projeto publica pacote (NuGet, npm, Maven, Composer), instale a versão fixa pelo gerenciador, com lockfile, como em dependência com cadeado. Atualizar vira trocar um número.
- Se precisar copiar, clone em vez de baixar zip. O clone guarda o histórico e permite saber o commit.
- Anote o commit de origem, a data, o caminho original e a licença num arquivo ao lado do código copiado.
- Faça a cópia intacta num commit e as suas alterações em commits separados. Assim, o diff entre "original" e "seu" é sempre visível.
- Exporte suas alterações como patches, para reaplicar sobre uma versão nova do original.
- Assine as releases e os alertas de segurança do projeto. No GitHub, a opção personalizada do botão Watch permite receber só esses avisos.
- Marque uma revisão periódica com responsável e data, para olhar o que mudou no original.
Se você já copiou sem anotar: descubra o commit de origem
Foi o caso da prefeitura. Dá para estimar de qual commit a cópia saiu comparando a pasta copiada com cada versão do original. Num clone do projeto original:
git clone https://github.com/orgao/sistema-publico.git
cd sistema-publico
mkdir -p /tmp/cand
for c in $(git rev-list --since=2025-01-01 main -- modulo/numeracao); do
git archive "$c" modulo/numeracao | tar -x -C /tmp/cand
echo "$c $(diff -r /tmp/cand/modulo/numeracao ../meu-sistema/src/numeracao | wc -l)"
rm -rf /tmp/cand/modulo
done | sort -k2 -n | head -3
O commit com menos linhas de diferença é o candidato mais provável. As linhas que sobram são, em grande parte, as suas alterações locais. Ajuste a data e o nome do branch principal para o projeto real; nem todo repositório usa main.
O arquivo de origem, ao lado do código
# src/numeracao/ORIGEM.md
origem: https://github.com/orgao/sistema-publico
caminho original: modulo/numeracao
commit base: 3f9c2e1 (2025-04-11)
licença: (nome exato do arquivo LICENSE do projeto)
alterações locais: patches/0001-numeracao-por-secretaria.patch
patches/0002-ano-fiscal.patch
responsável: Renata (substituto: Diego)
última revisão: 2026-10-01
A revisão periódica
No clone do original, veja o que mudou no módulo desde o seu commit base:
git fetch origin
git log --oneline 3f9c2e1..origin/main -- modulo/numeracao
Se aparecer uma correção, gere a versão nova do módulo e reaplique os seus patches com git apply --3way patches/*.patch sobre ela, num branch. Conflito em patch é sinal de que o original mudou a parte que você alterou: resolva com calma e com teste. Depois atualize o commit base no ORIGEM.md.
Se a sua alteração for útil para todos, mande para o projeto original como pull request. Cada mudança aceita lá é uma mudança a menos para você manter.
Erros comuns
- Baixar o zip. Sem histórico, você não sabe de qual versão veio, e cada correção futura exige arqueologia.
- Misturar a cópia com as suas mudanças no mesmo commit. Ninguém consegue separar o que é original do que é local na hora de atualizar.
- Ignorar a licença. Código copyleft dentro de sistema fechado pode gerar obrigação de abrir o código, descoberta só quando alguém reclama.
- Apontar para a ponta do repositório. Submódulo ou script que sempre pega o último commit traz mudança não revisada para a produção.
- Não assinar os alertas. A correção de segurança sai, e você fica sabendo pelo grupo de mensagens, meses depois.
- Fork sem responsável. Ninguém revisa o original, e o módulo envelhece até virar o pedaço do sistema que ninguém quer tocar.
Checklist
- A licença do projeto de origem foi lida e é compatível com o seu uso.
- O código veio por pacote com versão fixa ou por clone, nunca por zip solto.
- Existe um arquivo de origem com URL, commit base, licença e responsável.
- A cópia intacta e as alterações locais estão em commits separados.
- As alterações locais existem como patches reaplicáveis.
- Releases e alertas de segurança do original chegam a alguém do time.
- Há uma data marcada para a próxima revisão do que mudou no original.
Escolha um trecho de código de terceiros dentro do seu sistema e responda olhando só o repositório: você sabe dizer de qual commit do projeto original ele veio e o que foi alterado desde então?
Referência: https://github.com/projeto-siga/siga