aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xgit_cleaner.sh29
1 files changed, 29 insertions, 0 deletions
diff --git a/git_cleaner.sh b/git_cleaner.sh
new file mode 100755
index 0000000..9ab8ddd
--- /dev/null
+++ b/git_cleaner.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+BASE=/srv/repositories
+
+for repo in $(find $BASE -type d -name "*.git");
+do
+ # the gc.log is a copy of the stderr created by a backgrounded
+ # gc process. It will block further git operations until removed
+ # but we need a chance to at least look at what it's complaining
+ # about first.
+ if [ -f ${repo}/gc.log ];
+ then
+ echo "WARNING: found ${repo}/gc.log"
+ cat ${repo}/gc.log
+ rm -f ${repo}/gc.log
+ fi
+
+ # check for dangling commits and orphans
+ if [ ! -z "$(git fsck --connectivity-only --no-progress)" ];
+ then
+ # this causes dangling refs to expire now and prunes
+ # them from the object pack. It's expensive, however,
+ # because we end up repacking the object files.
+ git reflog expire --expire=now --all
+ ionice -c2 -n7 git gc --prune=now --agressive
+ else
+ ionice -c2 -n7 git gc --auto
+ fi
+done