chiark / gitweb /
git-cache-proxy: Periodically run `git gc --quiet'
authorIan Jackson <ian.jackson@eu.citrix.com>
Tue, 11 Feb 2020 15:56:42 +0000 (15:56 +0000)
committerIan Jackson <ian.jackson@eu.citrix.com>
Tue, 11 Feb 2020 16:00:22 +0000 (16:00 +0000)
commitddc6b3dbbe5514be113db999fbd64798bdc556f0
treee19593adc40154d729510c82d33c275051bc2c6d
parent97c5db97e30b7af527798310ab29fb99a45386f9
git-cache-proxy: Periodically run `git gc --quiet'

git has a feature which is supposed to automatically run git gc.

But if your repository accumulates enough loose objects, then this
occurs:

 $ git gc --auto
 Auto packing the repository in background for optimum performance.
 See "git help gc" for manual housekeeping.
 error: The last gc run reported the following. Please correct the root cause
 and remove gc.log.
 Automatic cleanup will not be performed until the file is removed.

 warning: There are too many unreachable loose objects; run 'git prune' to remove them.

Removing $GIT_DIR/gc.log generally simply causes git gc --auto to
print, again, the message:

 warning: There are too many unreachable loose objects; run 'git prune' to remove them.

Ie, a repository can get into a state where it needs gc so badly that
git will not gc it automatically.  This is, of course, mad.  It seems
to have been a misguided attempt at a safety catch.  Unfortunately
there does not even appear to be a configuration knob to set this `too
many' limit to infinity.

Work around this problem by running `git gc --quiet' (every 10 days,
by default).  This is not ideal because it runs even if we haven't
updated the tree, but we would rather do it out of housekeeping rather
than in the middle of fetch/clone.

`git gc' without --auto does not refuse to prune the objects that need
pruning, and fixes the repository.

We leave the gc.auto config option enabled since I think it is largely
harmless, and disabling it would be extra work.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
scripts/git-cache-proxy