summaryrefslogtreecommitdiff
path: root/git-prune-script
blob: 1a97ccc91ded1522d3016d76cbdf62557585d514 (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
#!/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
 
: ${GIT_DIR=.git}
: ${GIT_OBJECT_DIRECTORY="${SHA1_FILE_DIRECTORY-"$GIT_DIR/objects"}"}
 
# 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_DIR"/HEAD "$GIT_DIR"/refs/*/* /dev/null 2>/dev/null)
    shift ;;
esac
 
git-fsck-cache --cache --unreachable "$@" |
sed -ne '/unreachable /{
    s/unreachable [^ ][^ ]* //
    s|\(..\)|\1/|p
}' | {
	cd "$GIT_OBJECT_DIRECTORY" || exit
	xargs -r $dryrun rm -f
}