GitDatabase é uma solução que indexa repositórios Git e expõe os dados em PostgreSQL para consultas analíticas e de busca. Ele fornece:
- Sync de metadados Git (repositórios, refs, commits, arquivos, árvores)
- Hidratação de blobs (conteúdo textual dos arquivos)
- Busca de código com
search_code(pattern, lang) - (Opcional) UAST para análises semânticas
- Acesso via pgwire/psql para consultas SQL
Este repositório é um workspace Rust com múltiplos crates (CLI, DB, loader e pgwire).
crates/gitbase-cli— CLI principal (sync, search-index, hydrate-blobs, uast, serve)crates/gitbase-db— acesso ao PostgreSQL e migrationscrates/gitbase-loader— ingestão e hidratação de dados Gitcrates/gitbase-pgwire— servidor pgwire (porta padrão 5433)migrations/— schema do bancodocker/docker-compose.yml— Postgres local
- Rust (Cargo)
- Docker + docker-compose
- PostgreSQL client (
psql)
Este repositório inclui hooks via pre-commit para rodar cargo fmt e cargo clippy
antes de commitar e antes de fazer push.
Instale o pre-commit (exemplos):
pipx install pre-commitpip install --user pre-commitbrew install pre-commit
Depois, ative os hooks:
pre-commit install --hook-type pre-commit --hook-type pre-push
Para rodar manualmente em todos os arquivos:
pre-commit run --all-files
cd docker
docker-compose up -dA conexão padrão é:
- Host:
127.0.0.1 - Porta:
5433 - Banco:
gitbase - Usuário:
gitbase - Senha:
gitbase
DATABASE_URL=postgres://gitbase:gitbase@127.0.0.1:5433/gitbaseGITBASE_REPO_ROOTS=/caminho/para/repos
DATABASE_URL=postgres://gitbase:gitbase@127.0.0.1:5433/gitbase \ cargo run -p gitbase-cli -- sync --repo-roots /caminho/para/repos
Isso preenche gitbase.blobs.content, necessário para busca de conteúdo e indexação.
DATABASE_URL=postgres://gitbase:gitbase@127.0.0.1:5433/gitbase \ cargo run -p gitbase-cli -- hydrate-blobs --repo-roots /caminho/para/repos
Opcional: limitar com
--limitviaGITBASE_BLOB_HYDRATE_LIMIT.
DATABASE_URL=postgres://gitbase:gitbase@127.0.0.1:5433/gitbase \ cargo run -p gitbase-cli -- search-index
psql "postgres://gitbase:gitbase@127.0.0.1:5433/gitbase"Se o prompt aparecer como gitbase-#, use \r para limpar o comando pendente.
SELECT schema_name FROM information_schema.schemata ORDER BY schema_name;
SELECT table_schema, table_name FROM information_schema.tables WHERE table_type = 'BASE TABLE' ORDER BY table_schema, table_name;
SELECT table_name FROM information_schema.tables WHERE table_schema = 'gitbase' AND table_type = 'BASE TABLE' ORDER BY table_name;
SELECT DISTINCT r.name AS repository, f.path, f.language, f.size, f.is_binary FROM gitbase.files f JOIN gitbase.repositories r ON r.id = f.repository_id ORDER BY r.name, f.path LIMIT 200;
SELECT c.hash, c.author_name, c.author_email, c.committed_at, c.message, r.name AS repository FROM gitbase.commits c JOIN gitbase.repositories r ON r.id = c.repository_id WHERE c.author_email = 'email@dominio' ORDER BY c.committed_at DESC LIMIT 100;
SELECT r.name AS repository, s.path, s.commit_hash, s.language, s.score FROM gitbase.search_code('MimeKit') s JOIN gitbase.repositories r ON r.id = s.repository_id ORDER BY s.score DESC LIMIT 200;
SELECT DISTINCT ON (f.path) f.path, encode(b.content, 'hex') AS content_hex, convert_from(b.content, 'UTF8') AS content_text FROM gitbase.files f JOIN gitbase.blobs b ON b.hash = f.blob_hash JOIN gitbase.commits c ON c.repository_id = f.repository_id AND c.hash = f.commit_hash WHERE f.path = 'backend/src/CertificateManager.Core/Entities/User.cs' ORDER BY f.path, c.committed_at DESC LIMIT 1;
search_coderetornando 0 linhas- Rode
hydrate-blobse depoissearch-index.
- Rode
ERROR: invalid byte sequence for encoding "UTF8": 0x00- O índice ignora NUL bytes e normaliza o conteúdo automaticamente.
- Repetição de arquivos
gitbase.filesguarda arquivos por commit. UseDISTINCTse quiser um por caminho.
Este repositório possui documentação versionada em docs/ com publicação automática para gh-pages via GitHub Actions.
python -m pip install --upgrade pip pip install mkdocs mkdocs-material mkdocs serve
Depois acesse http://127.0.0.1:8000.
- Workflow:
.github/workflows/docs-gh-pages.yml - Dispara em push para
mainquando houver alterações emdocs/**oumkdocs.yml - Publica no branch
gh-pagesusandomkdocs gh-deploy
Se for a primeira publicação, confirme em Settings → Pages que o site usa o branch
gh-pages.
Consulte o arquivo de licença do projeto (se aplicável).