3 # Copyright (c) 2005 Linus Torvalds
10 a pack everything in a single pack
11 A same as -a, and turn unreachable objects loose
12 d remove redundant packs, and run git-prune-packed
13 f pass --no-reuse-delta to git-pack-objects
14 F pass --no-reuse-object to git-pack-objects
15 n do not run git-update-server-info
17 l pass --local to git-pack-objects
18 unpack-unreachable= with -A, do not loosen objects older than this
20 window= size of the window used for delta compression
21 window-memory= same as the above, but limit memory size instead of entries count
22 depth= limits the maximum delta depth
23 max-pack-size= maximum size of each packfile
28 no_update_info
= all_into_one
= remove_redundant
= unpack_unreachable
=
29 local= no_reuse
= extra
=
33 -n) no_update_info
=t
;;
36 unpack_unreachable
=--unpack-unreachable ;;
38 unpack_unreachable
="--unpack-unreachable=$2"; shift ;;
39 -d) remove_redundant
=t
;;
41 -f) no_reuse
=--no-reuse-delta ;;
42 -F) no_reuse
=--no-reuse-object ;;
44 --max-pack-size|
--window|
--window-memory|
--depth)
45 extra
="$extra $1=$2"; shift ;;
52 case "$(git config --bool repack.usedeltabaseoffset || echo true)" in
54 extra
="$extra --delta-base-offset" ;;
57 PACKDIR
="$GIT_OBJECT_DIRECTORY/pack"
58 PACKTMP
="$PACKDIR/.tmp-$$-pack"
60 trap 'rm -f "$PACKTMP"-*' 0 1 2 3 15
62 # There will be more repacking strategies to come...
63 case ",$all_into_one," in
65 args
='--unpacked --incremental'
69 if [ -d "$PACKDIR" ]; then
70 for e
in `cd "$PACKDIR" && find . -type f -name '*.pack' \
71 | sed -e 's/^\.\///' -e 's/\.pack$//'`
73 if [ -e "$PACKDIR/$e.keep" ]; then
76 existing
="$existing $e"
79 if test -n "$existing" && test -n "$unpack_unreachable" && \
80 test -n "$remove_redundant"
82 # This may have arbitrary user arguments, so we
83 # have to protect it against whitespace splitting
84 # when it gets run as "pack-objects $args" later.
85 # Fortunately, we know it's an approxidate, so we
86 # can just use dots instead.
87 args
="$args $(echo "$unpack_unreachable" | tr ' ' .)"
93 mkdir
-p "$PACKDIR" ||
exit
95 args
="$args $local ${GIT_QUIET:+-q} $no_reuse$extra"
96 names
=$
(git pack-objects
--keep-true-parents --honor-pack-keep --non-empty --all --reflog $args </dev
/null
"$PACKTMP") ||
98 if [ -z "$names" ]; then
99 say Nothing new to pack.
102 # Ok we have prepared all new packfiles.
104 # First see if there are packs of the same name and if so
105 # if we can move them out of the way (this can happen if we
106 # repacked immediately after packing fully.
114 test -f "$PACKDIR/$file" ||
continue
115 rm -f "$PACKDIR/old-$file" &&
116 mv "$PACKDIR/$file" "$PACKDIR/old-$file" ||
{
120 rollback
="$rollback $file"
122 test -z "$failed" ||
break
125 # If renaming failed for any of them, roll the ones we have
126 # already renamed back to their original names.
130 for file in $rollback
132 mv "$PACKDIR/old-$file" "$PACKDIR/$file" ||
133 rollback_failure
="$rollback_failure $file"
135 if test -n "$rollback_failure"
137 echo >&2 "WARNING: Some packs in use have been renamed by"
138 echo >&2 "WARNING: prefixing old- to their name, in order to"
139 echo >&2 "WARNING: replace them with the new version of the"
140 echo >&2 "WARNING: file. But the operation failed, and"
141 echo >&2 "WARNING: attempt to rename them back to their"
142 echo >&2 "WARNING: original names also failed."
143 echo >&2 "WARNING: Please rename them in $PACKDIR manually:"
144 for file in $rollback_failure
146 echo >&2 "WARNING: old-$file -> $file"
152 # Now the ones with the same name are out of the way...
156 fullbases
="$fullbases pack-$name"
157 chmod a-w
"$PACKTMP-$name.pack"
158 chmod a-w
"$PACKTMP-$name.idx"
159 mv -f "$PACKTMP-$name.pack" "$PACKDIR/pack-$name.pack" &&
160 mv -f "$PACKTMP-$name.idx" "$PACKDIR/pack-$name.idx" ||
164 # Remove the "old-" files
167 rm -f "$PACKDIR/old-pack-$name.idx"
168 rm -f "$PACKDIR/old-pack-$name.pack"
171 # End of pack replacement.
173 if test "$remove_redundant" = t
175 # We know $existing are all redundant.
176 if [ -n "$existing" ]
181 case " $fullbases " in
183 *) rm -f "$e.pack" "$e.idx" "$e.keep" ;;
188 git prune-packed
${GIT_QUIET:+-q}
191 case "$no_update_info" in
193 *) git update-server-info
;;