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).

Zur Installation springen

Quellinformationen

Repository
dandgabr/skills
Letzte Quellaktivität
7. September 2026 um 02:30
Erkannte Sprache von SKILL.md
Portugiesisch
Sterne
9
Forks
0

Installationsoptionen

Standardmäßig ist der Prompt ausgewählt, der zuerst die Quelle prüft. Sie können zu einem direkten Befehl wechseln oder eine lokale Kopie herunterladen.

Quelldateien prüfen

Lesen Sie SKILL.md und alle von SkillsMP angezeigten Begleitdateien, bevor Sie sich für eine Installation entscheiden.

Datei-Explorer
5 Dateien

SKILL.md wird angezeigt

SKILL.md
Quellanweisungen · Schreibgeschützte Vorschau
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 ```
Auf GitHub ansehen