summaryrefslogtreecommitdiff
path: root/git-prune-script
blob: c0ffb1dcba3bc59fe5717ca8d89645ce899452b5 (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
37
38
39
40
#!/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
}' | {
	for d in "$GIT_OBJECT_DIRECTORY" "$SHA1_FILE_DIRECTORY" ''
	do
		test "$d" != "" && test -d "$d" && break
	done
	case "$d" in
	'') cd .git/objects/ ;;
	*) cd "$d" ;;
	esac || exit
	xargs -r $dryrun rm -f
}