Housekeeping
GitLab supports and automates housekeeping tasks within your current repository, such as compressing file revisions and removing unreachable objects.
Configure housekeeping
GitLab automatically runs git gc
and git repack
on repositories
after Git pushes.
You can change how often this happens or turn it off:
- On the top bar, select Menu > Admin.
- On the left sidebar, select Settings > Repository.
- Expand Repository maintenance.
- Configure the Housekeeping options.
- Select Save changes.
For example, in the following scenario a git repack -d
will be executed:
- Project: pushes since GC counter (
pushes_since_gc
) =10
- Git GC period =
200
- Full repack period =
50
When the pushes_since_gc
value is 50 a repack -A -d --pack-kept-objects
runs, similarly when
the pushes_since_gc
value is 200 a git gc
runs:
-
git gc
(man page) runs a number of housekeeping tasks, such as compressing file revisions (to reduce disk space and increase performance) and removing unreachable objects which may have been created from prior invocations ofgit add
. -
git repack
(man page) re-organize existing packs into a single, more efficient pack.
Housekeeping also removes unreferenced LFS files
from your project on the same schedule as the git gc
operation, freeing up storage space for your project.
How housekeeping handles pool repositories
Housekeeping for pool repositories is handled differently from standard repositories.
It is ultimately performed by the Gitaly RPC FetchIntoObjectPool
.
This is the current call stack by which it is invoked:
Repositories::HousekeepingService#execute_gitlab_shell_gc
Projects::GitGarbageCollectWorker#perform
Projects::GitDeduplicationService#fetch_from_source
ObjectPool#fetch
ObjectPoolService#fetch
Gitaly::FetchIntoObjectPoolRequest
To manually invoke it from a Rails console, if needed, you can call project.pool_repository.object_pool.fetch
.
This is a potentially long-running task, though Gitaly times out in about 8 hours.
git prune
or git gc
in pool repositories! This can
cause data loss in “real” repositories that depend on the pool in
question.