1#!/bin/sh 2# 3# Copyright (c) 2005 Linus Torvalds 4# 5 6OPTIONS_KEEPDASHDASH= 7OPTIONS_SPEC="\ 8git repack [options] 9-- 10a pack everything in a single pack 11A same as -a, and turn unreachable objects loose 12d remove redundant packs, and run git-prune-packed 13f pass --no-reuse-object to git-pack-objects 14n do not run git-update-server-info 15q,quiet be quiet 16l pass --local to git-pack-objects 17 Packing constraints 18window= size of the window used for delta compression 19window-memory= same as the above, but limit memory size instead of entries count 20depth= limits the maximum delta depth 21max-pack-size= maximum size of each packfile 22" 23SUBDIRECTORY_OK='Yes' 24. git-sh-setup 25 26no_update_info= all_into_one= remove_redundant= unpack_unreachable= 27local= quiet= no_reuse= extra= 28whiletest$#!=0 29do 30case"$1"in 31-n) no_update_info=t ;; 32-a) all_into_one=t ;; 33-A) all_into_one=t 34 unpack_unreachable=--unpack-unreachable;; 35-d) remove_redundant=t ;; 36-q) quiet=-q;; 37-f) no_reuse=--no-reuse-object;; 38-l)local=--local;; 39--max-pack-size|--window|--window-memory|--depth) 40 extra="$extra$1=$2";shift;; 41--)shift;break;; 42*) usage ;; 43esac 44shift 45done 46 47case"`git config --bool repack.usedeltabaseoffset || echo true`"in 48true) 49 extra="$extra--delta-base-offset";; 50esac 51 52PACKDIR="$GIT_OBJECT_DIRECTORY/pack" 53PACKTMP="$GIT_OBJECT_DIRECTORY/.tmp-$$-pack" 54rm-f"$PACKTMP"-* 55trap'rm -f "$PACKTMP"-*'0 1 2 3 15 56 57# There will be more repacking strategies to come... 58case",$all_into_one,"in 59,,) 60 args='--unpacked --incremental' 61;; 62,t,) 63 args= existing= 64if[-d"$PACKDIR"];then 65for e in`cd "$PACKDIR" && find . -type f -name '*.pack' \ 66 | sed -e 's/^\.\///' -e 's/\.pack$//'` 67do 68if[-e"$PACKDIR/$e.keep"];then 69: keep 70else 71 existing="$existing$e" 72fi 73done 74iftest -n"$existing" 75then 76 args="--kept-pack-only" 77fi 78iftest -n"$args"-a -n"$unpack_unreachable"-a \ 79-n"$remove_redundant" 80then 81 args="$args$unpack_unreachable" 82fi 83fi 84;; 85esac 86 87args="$args$local$quiet$no_reuse$extra" 88names=$(git pack-objects --honor-pack-keep --non-empty --all --reflog $args </dev/null "$PACKTMP")|| 89exit1 90if[-z"$names"];then 91iftest -z"$quiet";then 92echo Nothing new to pack. 93fi 94fi 95 96# Ok we have prepared all new packfiles. 97mkdir-p"$PACKDIR"||exit 98 99# First see if there are packs of the same name and if so 100# if we can move them out of the way (this can happen if we 101# repacked immediately after packing fully. 102rollback= 103failed= 104for name in$names 105do 106for sfx in pack idx 107do 108file=pack-$name.$sfx 109test -f"$PACKDIR/$file"||continue 110rm-f"$PACKDIR/old-$file"&& 111mv"$PACKDIR/$file""$PACKDIR/old-$file"|| { 112 failed=t 113break 114} 115 rollback="$rollback$file" 116done 117test -z"$failed"||break 118done 119 120# If renaming failed for any of them, roll the ones we have 121# already renamed back to their original names. 122iftest -n"$failed" 123then 124 rollback_failure= 125forfilein$rollback 126do 127mv"$PACKDIR/old-$file""$PACKDIR/$file"|| 128 rollback_failure="$rollback_failure$file" 129done 130iftest -n"$rollback_failure" 131then 132echo>&2"WARNING: Some packs in use have been renamed by" 133echo>&2"WARNING: prefixing old- to their name, in order to" 134echo>&2"WARNING: replace them with the new version of the" 135echo>&2"WARNING: file. But the operation failed, and" 136echo>&2"WARNING: attempt to rename them back to their" 137echo>&2"WARNING: original names also failed." 138echo>&2"WARNING: Please rename them in$PACKDIRmanually:" 139forfilein$rollback_failure 140do 141echo>&2"WARNING: old-$file->$file" 142done 143fi 144exit1 145fi 146 147# Now the ones with the same name are out of the way... 148fullbases= 149for name in$names 150do 151 fullbases="$fullbasespack-$name" 152chmod a-w"$PACKTMP-$name.pack" 153chmod a-w"$PACKTMP-$name.idx" 154mv-f"$PACKTMP-$name.pack""$PACKDIR/pack-$name.pack"&& 155mv-f"$PACKTMP-$name.idx""$PACKDIR/pack-$name.idx"|| 156exit 157done 158 159# Remove the "old-" files 160for name in$names 161do 162rm-f"$PACKDIR/old-pack-$name.idx" 163rm-f"$PACKDIR/old-pack-$name.pack" 164done 165 166# End of pack replacement. 167 168iftest"$remove_redundant"= t 169then 170# We know $existing are all redundant. 171if[-n"$existing"] 172then 173(cd"$PACKDIR"&& 174for e in$existing 175do 176case"$fullbases"in 177*"$e"*) ;; 178*)rm-f"$e.pack""$e.idx""$e.keep";; 179esac 180done 181) 182fi 183 git prune-packed$quiet 184fi 185 186case"$no_update_info"in 187t) : ;; 188*) git-update-server-info;; 189esac