diff options
-rwxr-xr-x | git_cleaner.sh | 29 |
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 |