git-prune-scripton commit Git-prune-script loses blobs referenced from an uncommitted cache. (ae7c0c9)
   1#!/bin/sh
   2
   3dryrun=
   4while case "$#" in 0) break ;; esac
   5do
   6    case "$1" in
   7    -n) dryrun=echo ;;
   8    --) break ;;
   9    -*) echo >&2 "usage: git-prune-script [ -n ] [ heads... ]"; exit 1 ;;
  10    *)  break ;;
  11    esac
  12    shift;
  13done
  14
  15# Defaulting to include .git/refs/*/* may be debatable from the
  16# purist POV but power users can always give explicit parameters
  17# to the script anyway.
  18
  19case "$#" in
  200)
  21    x_40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
  22    x_40="$x_40$x_40$x_40$x_40$x_40$x_40$x_40$x_40"
  23    set x $(sed -ne "/^$x_40\$/p" .git/HEAD .git/refs/*/* 2>/dev/null)
  24    shift ;;
  25esac
  26
  27git-fsck-cache --cache --unreachable "$@" |
  28sed -ne '/unreachable /{
  29    s/unreachable [^ ][^ ]* //
  30    s|\(..\)|\1/|p
  31}' | {
  32        case "$SHA1_FILE_DIRECTORY" in
  33        '') cd .git/objects/ ;;
  34        *) cd "$SHA1_FILE_DIRECTORY" ;;
  35        esac || exit
  36        xargs -r $dryrun rm -f
  37}