Configuration and tuning
Configure pgit at the repository and global level, set environment variables, and tune the database container for your hardware.
Configuration and tuning
pgit has two layers of configuration: per-repository settings (who you are, your remotes) and global settings (the database container and import defaults, shared by every repo). The default container settings are deliberately conservative, sized for an 8 GB laptop, so the main reason to tune is to make large imports and queries faster on a bigger machine.
The two scopes
- Repository config lives in
.pgit/config.tomlinside each repo. It holds your commit identity and remotes. - Global config lives in your user config directory and applies everywhere:
~/.config/pgit/config.tomlon Linux (or$XDG_CONFIG_HOME/pgit),~/Library/Application Support/pgit/config.tomlon macOS, and%APPDATA%\pgit\config.tomlon Windows.
You rarely edit these files by hand. Use the config command.
The config command
pgit config user.name "Ada Lovelace" # set a repo valuepgit config user.name # get a repo valuepgit config --list # list repo configpgit config --global --list # list global configpgit config --global container.shared_buffers 2GB # set a global valuepgit config --global container.shared_buffers # get a global valueValues are validated when you set them, so an out-of-range port or a malformed size is rejected rather than silently breaking the container.
Repository settings
| Key | Meaning |
|---|---|
user.name |
Author name recorded on commits |
user.email |
Author email recorded on commits |
remote.<name>.url |
A remote's connection URL (see Remotes) |
core.local_db |
The repo's database name (read-only, derived from the path) |
If user.name or user.email is unset, pgit falls back to the PGIT_AUTHOR_NAME / PGIT_AUTHOR_EMAIL environment variables, then to your git config. You can also set a global default identity with pgit config --global user.name "...".
Global settings and the restart rule
Global config covers the PostgreSQL container (container.*) and the import default (import.workers). The container reads these once, at startup.
Changing any container.* value does not affect a running container. Apply it by recreating the container, which preserves your data:
pgit local destroy && pgit local startEnvironment variables
A handful of variables tweak behaviour without touching config files:
| Variable | Effect |
|---|---|
PGIT_CONTAINER_RUNTIME |
Force docker or podman instead of auto-detect |
PGIT_ACCESSIBLE |
Set to 1 for accessibility mode (no animations) |
NO_COLOR |
Disable colored output |
PGIT_AUTHOR_NAME / PGIT_AUTHOR_EMAIL |
Commit identity fallback |
PGIT_EDITOR, VISUAL, EDITOR |
Editor for commit messages, tried in that order |
Tuning for your hardware
The defaults suit a small machine. If you are importing or querying a large repository, pick the profile closest to your hardware and paste it, then restart the container. These are starting points, not gospel; measure and adjust.
pgit config --global container.shared_buffers 2GBpgit config --global container.effective_cache_size 6GBpgit config --global container.shm_size 3gpgit config --global container.work_mem 32MBpgit config --global container.max_wal_size 4GBpgit config --global container.max_worker_processes 8pgit config --global container.max_parallel_workers 4pgit config --global container.xpatch_cache_size_mb 1024pgit config --global container.xpatch_encode_threads 4pgit config --global import.workers 4pgit config --global container.shared_buffers 16GBpgit config --global container.effective_cache_size 48GBpgit config --global container.shm_size 20gpgit config --global container.work_mem 128MBpgit config --global container.max_wal_size 8GBpgit config --global container.max_worker_processes 12pgit config --global container.max_parallel_workers 8pgit config --global container.xpatch_cache_size_mb 8192pgit config --global container.xpatch_encode_threads 8pgit config --global import.workers 8pgit config --global container.shared_buffers 64GBpgit config --global container.effective_cache_size 200GBpgit config --global container.shm_size 80gpgit config --global container.work_mem 256MBpgit config --global container.max_wal_size 32GBpgit config --global container.max_worker_processes 20pgit config --global container.max_parallel_workers 16pgit config --global container.xpatch_cache_size_mb 32768pgit config --global container.xpatch_encode_threads 16pgit config --global import.workers 16Then apply:
pgit local destroy && pgit local startMonitoring what you changed
Check whether the cache is doing its job:
pgit sql "SELECT * FROM xpatch.cache_stats()" # cache hit rate (aim above 90%)pgit stats --xpatch # per-table compression and cache detail- A high
miss_countversushit_countmeans the cache is too small. Raisexpatch_cache_size_mb. - A high
skip_countmeans entries are rejected for being too large. Raisexpatch_cache_max_entry_kb.
When something is slow or breaks
- Container will not start (shared memory error): raise
shm_sizeaboveshared_buffers. - Import is slow: raise
xpatch_encode_threadsandimport.workerstoward your core count, and raisemax_wal_size/checkpoint_timeoutto cut checkpoint stalls. - Queries are slow: raise
xpatch_cache_size_mb, then re-checkcache_stats(). - Out of memory during import: lower
import.workers,xpatch_encode_threads, andwork_mem.
Setting reference
PostgreSQL settings:
| Setting | Default | Rule of thumb |
|---|---|---|
shared_buffers |
256MB | 25% of RAM (cap around 64GB) |
effective_cache_size |
1GB | 75% of RAM |
work_mem |
16MB | RAM / max_connections / 4 |
wal_buffers |
64MB | 64MB to 512MB by import size |
shm_size |
256m | shared_buffers times 1.25 |
max_wal_size |
4GB | 8GB to 32GB for large imports |
checkpoint_timeout |
30min | 60min for large imports |
max_connections |
100 | 50 for local single-user |
max_worker_processes |
4 | cores plus 4 |
max_parallel_workers |
4 | cores |
max_parallel_per_gather |
2 | cores / 2 |
pg-xpatch settings:
| Setting | Default | Rule of thumb |
|---|---|---|
xpatch_cache_size_mb |
256 | 10% to 15% of RAM |
xpatch_cache_max_entries |
65536 | cache_size_mb times 64 |
xpatch_cache_max_entry_kb |
256 | 1024 to 16384 to allow large files |
xpatch_cache_partitions |
32 | cores |
xpatch_encode_threads |
0 | cores, for imports |
xpatch_insert_cache_slots |
16 | 16 plus cache_size_mb / 128 |
xpatch_warm_cache_workers |
4 | cores, for cache warming |
Import setting:
| Setting | Default | Rule of thumb |
|---|---|---|
import.workers |
3 | cores |
For the meaning of each xpatch knob and the engine-side detail, see pg-xpatch server parameters and tuning compression.
Where to go next
Every command and flag.
The tables your queries and stats run against.
Did this work on your setup?
Not rated yet