#!/bin/bash BASE=/srv/repositories # silence pushd/popd pushd () { command pushd "$@" > /dev/null } popd () { command popd "$@" > /dev/null } for repo in $(find $BASE -type d -name "*.git" | grep -v /people/); do pushd $repo # 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 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 --aggressive >/dev/null else ionice -c2 -n7 -- git gc --auto > /dev/null fi done