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/reposIsso 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/reposOpcional: limitar com
--limitviaGITBASE_BLOB_HYDRATE_LIMIT.
DATABASE_URL=postgres://gitbase:gitbase@127.0.0.1:5433/gitbase \
cargo run -p gitbase-cli -- search-indexpsql "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.
Consulte o arquivo de licença do projeto (se aplicável).