summaryrefslogtreecommitdiff
path: root/git-prune-script
blob: 9ba89a5b9d0d484aee54d0bdb6deabdc71962c85 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/sh
dryrun=
while case "$#" in 0) break ;; esac
do
    case "$1" in
    -n) dryrun=echo ;;
    --) break ;;
    -*) echo >&2 "usage: git-prune-script [ -n ] [ heads... ]"; exit 1 ;;
    *)  break ;;
    esac
    shift;
done

# Defaulting to include .git/refs/*/* may be debatable from the
# purist POV but power users can always give explicit parameters
# to the script anyway.

case "$#" in
0)
    x_40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
    x_40="$x_40$x_40$x_40$x_40$x_40$x_40$x_40$x_40"
    set x $(sed -ne "/^$x_40\$/p" .git/HEAD .git/refs/*/* 2>/dev/null)
    shift ;;
esac

git-fsck-cache --cache --unreachable "$@" |
sed -ne '/unreachable /{
    s/unreachable [^ ][^ ]* //
    s|\(..\)|\1/|p
}' | {
	case "$SHA1_FILE_DIRECTORY" in
	'') cd .git/objects/ ;;
	*) cd "$SHA1_FILE_DIRECTORY" ;;
	esac || exit
	xargs -r $dryrun rm -f
}