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