Skip to main content

vcs-repository-management

Especialista em Sistemas de Controle de Versão (VCS) e Gestão Avançada de Repositórios. Domina Git de baixo nível (DAG, objetos, reflog, worktrees, sparse-checkout, LFS, submodules, bisect, filter-repo), Subversion/SVN (arquitetura FSFS, trunk/branches/tags, svn:mergeinfo, svn:externals, svnadmin, hooks), Mercurial (Hg), estratégias de branching (Trunk-based, GitFlow), migração de repositórios legados para Git e escalabilidade de monorepos (Scalar).

Jump to install

Source facts

Repository
dandgabr/skills
Last source activity
September 7, 2026 at 02:30
Detected SKILL.md language
Portuguese
Stars
9
Forks
0

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

File Explorer
5 files

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
vcs-repository-management
description
Especialista em Sistemas de Controle de Versão (VCS) e Gestão Avançada de Repositórios. Domina Git de baixo nível (DAG, objetos, reflog, worktrees, sparse-checkout, LFS, submodules, bisect, filter-repo), Subversion/SVN (arquitetura FSFS, trunk/branches/tags, svn:mergeinfo, svn:externals, svnadmin, hooks), Mercurial (Hg), estratégias de branching (Trunk-based, GitFlow), migração de repositórios legados para Git e escalabilidade de monorepos (Scalar).
# 🛠️ vcs-repository-management: Engenharia Avançada de Controle de Versão e Gestão de Repositórios Esta habilidade fornece os padrões de engenharia, arquitetura de dados de controle de versão, administração de repositórios e técnicas de migração entre ecossistemas VCS distribuídos (Git, Mercurial) e centralizados (Subversion, Perforce). --- ## 1. Fundamentos e Mecânica Interna do Git ### 1.1. Estrutura de Dados em Grafo Acíclico Dirigido (DAG) O Git é um sistema de arquivos indexado por conteúdo (*content-addressable filesystem*). Toda informação é armazenada no banco de objetos (`.git/objects/`) identificada pelo hash criptográfico SHA-1 (40 caracteres hexadecimais) ou SHA-256 (64 caracteres hexadecimais): - **`blob` (Binary Large Object)**: Armazena apenas os dados brutos de um arquivo, desprovido de nome, permissões ou data. - **`tree`**: Representa um diretório. Mapeia identificadores de objetos (`blob` ou sub-`tree`), modos de permissão POSIX (`100644`, `100755`, `040000`) e nomes de arquivos. - **`commit`**: Aponta para a `tree` raiz de um snapshot, referencia zero ou mais commits pais (`parent`), identifica autor e committer (com timestamp e fuso horário) e contém a mensagem explicativa. - **`tag` (Anotada)**: Objeto permanente apontando para um commit específico, contendo tagger, timestamp, mensagem e opcionalmente assinatura criptográfica GPG/SSH. ```text [Commit C2] ──── parent ────> [Commit C1] │ │ tree tree ▼ ▼ [Tree T2] [Tree T1] ├── blob B1 (modificado) ├── blob B1 (versão inicial) └── tree Sub └── blob B2 └── blob B3 ``` ### 1.2. O Índice (Staging Area) e Mecanismo de Commits O índice (`.git/index`) é uma estrutura binária em disco que representa o próximo snapshot planejado. As alterações migram entre os três estados fundamentais: 1. **Working Tree**: Arquivos no diretório de trabalho local. 2. **Index / Staging**: Árvore intermediária preparada via `git add`. 3. **Repository (HEAD)**: Histórico imutável de snapshots commitados no branch atual. ### 1.3. Otimização de Armazenamento e Delta Compression (Packfiles) O Git armazena objetos inicialmente como objetos soltos (*loose objects* comprimidos via zlib). Quando o volume cresce, aciona o empacotamento (*packing*): - **Packfile (`.pack`)**: Arquivo consolidado onde objetos semelhantes são armazenados através de compressão diferencial (deltas bidirecionais baseados no algoritmo de Rabin Fingerprint). - **Index do Packfile (`.idx`)**: Tabela hash que mapeia SHA para offsets exatos dentro do `.pack`, permitindo busca $O(1)$. - **Comandos de Manutenção**: ```bash # Verificação de integridade estrutural e objetos órfãos git fsck --full --strict # Repacotamento agressivo com compactação máxima git gc --aggressive --prune=now git repack -a -d -f --depth=250 --window=250 ``` --- ## 2. Manipulação Avançada de Histórico e Forense ### 2.1. Rebase Interativo e Higienização de Histórico Permite refinar commits antes do compartilhamento com o time, garantindo commits atômicos e descritivos: ```bash # Iniciar rebase interativo dos últimos 5 commits git rebase -i HEAD~5 ``` **Comandos do Rebase Interativo**: - `pick`: Mantém o commit inalterado. - `reword`: Altera apenas a mensagem do commit. - `edit`: Interrompe a execução para permitir emendas no código (`git commit --amend`). - `squash`: Funde o commit com o anterior, combinando as mensagens. - `fixup`: Funde o commit com o anterior descartando a mensagem atual (ideal para correções rápidas com `git commit --fixup <SHA>`). - `drop`: Remove completamente o commit do histórico. ### 2.2. O Reflog (Reference Log) e Recuperação de Desastres O `git reflog` rastreia todas as atualizações de ponteiros de branches e `HEAD` nos últimos 90 dias (por padrão): ```bash # Inspecionar histórico de movimentações da HEAD git reflog show HEAD # Restaurar commit acidentalmente deletado via reset hard git reset --hard HEAD@{2} # Resgatar branch deletada a partir do SHA identificado no reflog git checkout -b branch-restaurada e4a81c2 ``` ### 2.3. Depuração Bissexual Automatizada (`git bisect`) Localiza o commit exato que introduziu uma regressão através de busca binária $O(\log n)$ no histórico: ```bash # Iniciar sessão de bisect git bisect start git bisect bad HEAD # Versão atual está com defeito git bisect good v2.4.0 # Versão v2.4.0 estava íntegra # Execução 100% automatizada com script de teste de saída (exit 0 = good, exit != 0 = bad) git bisect run pytest tests/unit/test_payment.py ``` ### 2.4. Purga Forense com `git-filter-repo` Substituto moderno, seguro e ordens de magnitude mais rápido que o obsoleto `git filter-branch`: ```bash # Instalação pip install git-filter-repo # 1. Purgar arquivo sensível (.env ou chave privada) de TODO o histórico git-filter-repo --invert-paths --path secrets.env --path id_rsa # 2. Purgar arquivos maiores que 50MB que entraram indevidamente no histórico git-filter-repo --strip-blobs-bigger-than 50M # 3. Reescrever histórico alterando e-mails ou nomes de autores git-filter-repo --mailmap my-mailmap.txt ``` --- ## 3. Gestão de Workspaces, Dependências e Monorepos ### 3.1. Múltiplas Árvores de Trabalho com `git worktree` Permite alternar de contexto ou rodar testes longos sem precisar de `git stash` ou clonar o repositório novamente: ```bash # Criar uma worktree isolada para hotfix em diretório paralelo git worktree add ../hotfix-auth-service hotfix/login-bug # Listar worktrees ativas git worktree list # Remover worktree concluída git worktree remove ../hotfix-auth-service git worktree prune ``` ### 3.2. Clones Leves e `sparse-checkout` para Monorepos Gigantes Para repositórios de dezenas de gigabytes, evite baixar todo o histórico e árvores: ```bash # Clone sem blobs (baixa apenas a árvore e histórico de commits; blobs baixados sob demanda) git clone --filter=blob:none https://github.com/org/monorepo.git # Clone raso com profundidade limitada git clone --depth=1 --no-single-branch https://github.com/org/monorepo.git # Sparse-checkout em modo cone (baixa apenas pastas selecionadas) git sparse-checkout init --cone git sparse-checkout set services/payment services/auth shared/libs ``` ### 3.3. Git LFS (Large File Storage) Mantém ponteiros de texto no Git e os arquivos binários volumosos (vídeos, modelos de ML, datasets) em servidores de storage dedicados: ```bash # Inicializar LFS no repositório git lfs install # Rastrear extensões de binários git lfs track "*.onnx" "*.zip" "*.tar.gz" "*.mp4" git add .gitattributes # Validar arquivos gerenciados pelo LFS git lfs ls-files ``` ### 3.4. Git Submodules vs. Git Subtree - **Submodules**: Aponta para um commit específico de um repositório remoto via arquivo `.gitmodules`. Menor acoplamento, mas exige gerenciamento explícito (`git submodule update --init --recursive`). - **Subtrees**: Mescla o histórico de outro repositório diretamente em uma subpasta do repositório principal sem alterar metadados de clonagem. Maior facilidade para desenvolvedores downstream (`git subtree add --prefix=vendor/lib https://github.com/org/lib.git main --squash`). --- ## 4. Arquitetura e Engenharia de Subversion (SVN) ### 4.1. Paradigma Centralizado e Backend FSFS Diferente do Git (onde todo clone possui todo o histórico), o SVN opera em modelo cliente-servidor centralizado: - **Revisões Globais Atômicas**: Cada commit incrementa um número de revisão inteiro global ($r1, r2, \dots, rN$) que representa o estado completo de todo o sistema de arquivos na árvore do servidor. - **FSFS (Filesystem on Filesystem)**: Mecanismo de persistência baseado em arquivos planos que agrupa revisões em shards para alta tolerância a falhas. - **Peg Revisions vs. Operative Revisions**: - `svn cat -r 15 foo.c@10`: Mostra o arquivo `foo.c` como ele existia na revisão operativa 15, rastreando a linhagem do arquivo denominado `foo.c` na revisão peg 10 (resolvendo renomeações e deleções passadas). ### 4.2. Convenção Canônica de Diretórios no SVN ```text meu-projeto/ ├── trunk/ # Linha principal de desenvolvimento contínuo (HEAD) ├── branches/ # Bifurcações temporárias para features, manutenções ou releases │ ├── feature-pix/ │ └── release-2.0/ └── tags/ # Cópias estáticas e congeladas de releases específicos (ex: v1.0.0) ``` No SVN, branches e tags são **cópias baratas** (*cheap copies* / cópias com cópia na escrita — Copy-on-Write) criadas pelo comando `svn copy`. ### 4.3. Propriedades de Versão (`svn:props`) Metadados versionados anexados a arquivos e diretórios: - **`svn:ignore`**: Equivalente ao `.gitignore`, define padrões ignorados localmente. - **`svn:keywords`**: Expansão de variáveis no código (ex.: `$Id$`, `$Date$`, `$Revision$`). - **`svn:eol-style`**: Normalização de quebras de linha (`LF`, `CRLF` ou `native`). - **`svn:externals`**: Mapeia repositórios ou pastas externas dentro da árvore local (análogo aos submodules do Git). - **`svn:mergeinfo`**: Rastreia quais intervalos de revisão foram mesclados entre branches para evitar repetição de conflitos. ### 4.4. Administração de Repositórios SVN (`svnadmin`) ```bash # Criar novo repositório com backend FSFS svnadmin create /var/svn/repos/financeiro --fs-type fsfs # Realizar backup completo (dump stream) svnadmin dump /var/svn/repos/financeiro > backup_financeiro.dump # Restaurar ou carregar histórico em repositório novo svnadmin load /var/svn/repos/novo_financeiro < backup_financeiro.dump # Verificação de integridade do banco FSFS svnadmin verify /var/svn/repos/financeiro # Sincronização e espelhamento contínuo entre servidores svnsync initialize https://svn-mirror.local/repos/financeiro https://svn-master.local/repos/financeiro svnsync sync https://svn-mirror.local/repos/financeiro ``` ### 4.5. Hooks de Servidor SVN Scripts executados no servidor acionados por eventos de commit e controle transacional: - **`pre-commit`**: Executado dentro de uma transação antes da confirmação. Pode abortar o commit retornando status code != 0 e emitindo mensagem de erro no `stderr`. ```bash #!/bin/bash # Validação de mensagem de commit não vazia REPOS="$1" TXN="$2" LOGMSG=$(svnlook log -t "$TXN" "$REPOS") if [ -z "$LOGMSG" ]; then echo "ERRO: Commits sem mensagem explicativa são proibidos." >&2 exit 1 fi ``` - **`post-commit`**: Executado após a confirmação para disparar webhooks, e-mails ou gatilhos de build CI/CD. --- ## 5. Mercurial (Hg) e Perforce Helix Core ### 5.1. Mercurial (Hg) - **Estrutura Revlog**: Armazena histórico em arquivos append-only com index (`.i`) e dados (`.d`), garantindo leituras e escritas rápidas. - **Fases de Mutabilidade**: - `public`: Commits compartilhados publicamente, imutáveis por padrão. - `draft`: Commits locais, ainda passíveis de rebase ou emendas. - `secret`: Commits privados que nunca são propagados durante o `hg push`. - **Extensões Oficiais**: `evolve` (evolução distribuída de histórico sem quebra de commits) e `hg-git` (interoperabilidade nativa com remotos Git). ### 5.2. Perforce Helix Core - Sistema centralizado de alta performance, padrão em indústrias de jogos e semicondutores para arquivos binários multimídia gigantes (terabytes). - Utiliza **Client Workspaces** mapeadas para **Depots**, gerencia alterações por **Changelists** atômicas numeradas e implementa controle de concorrência com **File Locking** exclusivo (`p4 edit` / `p4 submit`). --- ## 6. Interoperabilidade e Migração entre Sistemas VCS ### 6.1. Ponte Bidirecional com `git-svn` Permite utilizar a flexibilidade local do Git em bases de código centralizadas em SVN: ```bash # Clonar repositório SVN com layout padrão (trunk, branches, tags) git svn clone --stdlayout --authors-file=authors.txt http://svn.empresa.com/repos/app app-git # Atualizar base local com novos commits do SVN (rebase limpo) git svn rebase # Desenvolver commits locais normalmente no Git git commit -m "feat: implementa nova rota de pagamentos" # Publicar commits locais de volta para o repositório SVN git svn dcommit ``` ### 6.2. Migração Integral de SVN para Git Nativo Procedimento canônico para migrar histórico completo sem perda de linhagem, branches ou autores: #### Passo 1: Extrair e Mapear Autores do SVN para o Git ```bash # Extrair todos os autores únicos do histórico do SVN svn log -q http://svn.empresa.com/repos/app | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2}' | sort -u > svn-authors.txt # Mapear para o formato: svnuser = Nome Completo <email@empresa.com> sed -i 's/^\(.*\)$/\1 = \1 <\1@empresa.com>/' svn-authors.txt ``` #### Passo 2: Clonagem via `git-svn` ```bash git svn clone --stdlayout --authors-file=svn-authors.txt http://svn.empresa.com/repos/app app-migrado ``` #### Passo 3: Converter Branches e Tags Remotas do SVN para Referências Git Locais ```bash cd app-migrado # Converter tags remotas em tags reais anotadas do Git for tag in $(git branch -r | grep 'tags/'); do tag_name=$(echo $tag | sed 's/.*tags\///') git tag -a -m "Convertido do SVN tag: $tag_name" "$tag_name" "$tag" git branch -r -d "$tag" done # Converter branches remotas em branches locais rastreáveis for branch in $(git branch -r | grep -v 'trunk' | grep -v 'tags/'); do branch_name=$(echo $branch | sed 's/.*///') git branch "$branch_name" "$branch" git branch -r -d "$branch" done ``` #### Passo 4: Migração de `svn:ignore` para `.gitignore` ```bash git svn show-ignore > .gitignore git add .gitignore git commit -m "chore: migra propriedades svn:ignore para .gitignore" ``` #### Passo 5: Vincular ao Novo Repositório Remoto Git e Publicar ```bash git remote add origin git@github.com:empresa/app.git git push --all origin git push --tags origin ``` --- ## 7. Governança, Estratégias de Branching e Segurança ### 7.1. Estratégias de Branching 1. **Trunk-Based Development (Recomendado para CI/CD Moderno)**: - Todos os desenvolvedores integram alterações pequenas e frequentes diretamente no `main` (ou em branches de curta duração $< 1$ dia). - Utilização de **Feature Flags** para desacoplar deploy de release e manter o branch principal sempre estável e deployável. 2. **GitFlow (Tradicional para Ciclos de Release Agendados)**: - Estrutura com branches de longa duração: `main` (produção) e `develop` (integração contínua). - Branches auxiliares: `feature/*`, `release/*` e `hotfix/*`. ### 7.2. Assinatura Criptográfica de Commits e Tags (GPG & SSH) Garante o não-repúdio e impede falsificação de identidade de committers: ```bash # Configurar assinatura de commits com chave SSH moderna git config --global user.signingkey "~/.ssh/id_ed25519.pub" git config --global gpg.format ssh git config --global commit.gpgsign true git config --global tag.gpgsign true # Validar assinatura de commits git log --show-signature -n 5 ``` ### 7.3. Proteção de Branches e `CODEOWNERS` - Configuração de políticas de pull request: aprovações mínimas, exigência de status checks de CI aprovados e proibição de push forçado (`force-push`). - Mapeamento de revisores obrigatórios por domínio em `.github/CODEOWNERS`: ```text # Regras de revisão por path * @org/core-team /services/billing/ @org/billing-engineers /infra/ @org/devops-architects *.sql @org/dba-specialists ```
View on GitHub