Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100755 195 lines (179 sloc) 4.983 kb
b2d4619 Add "git repack" command that does an incremental pack
Linus Torvalds authored
1 #!/bin/sh
ccf1ee3 Generate pack info file after repack.
Junio C Hamano authored
2 #
3 # Copyright (c) 2005 Linus Torvalds
4 #
5
5715d0b @MadCoder Migrate git-repack.sh to use git-rev-parse --parseopt
MadCoder authored
6 OPTIONS_KEEPDASHDASH=
7 OPTIONS_SPEC="\
1b1dd23 @sbeyer Make usage strings dash-less
sbeyer authored
8 git repack [options]
5715d0b @MadCoder Migrate git-repack.sh to use git-rev-parse --parseopt
MadCoder authored
9 --
10 a pack everything in a single pack
ca11b21 let pack-objects do the writing of unreachable objects as loose objects
Nicolas Pitre authored
11 A same as -a, and turn unreachable objects loose
5715d0b @MadCoder Migrate git-repack.sh to use git-rev-parse --parseopt
MadCoder authored
12 d remove redundant packs, and run git-prune-packed
5c47e1c @jast repack: add -F flag to let user choose between --no-reuse-delta/object
jast authored
13 f pass --no-reuse-delta to git-pack-objects
14 F pass --no-reuse-object to git-pack-objects
2b36b14 @gitzilla git-repack: re-enable parsing of -n command line option
gitzilla authored
15 n do not run git-update-server-info
5715d0b @MadCoder Migrate git-repack.sh to use git-rev-parse --parseopt
MadCoder authored
16 q,quiet be quiet
17 l pass --local to git-pack-objects
7e52f56 @peff gc: do not explode objects which will be immediately pruned
peff authored
18 unpack-unreachable= with -A, do not loosen objects older than this
5715d0b @MadCoder Migrate git-repack.sh to use git-rev-parse --parseopt
MadCoder authored
19 Packing constraints
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
24 "
d0b353b @peff git-repack: allow git-repack to run in subdirectory
peff authored
25 SUBDIRECTORY_OK='Yes'
ae2b0f1 git-sh-setup: die if outside git repository.
Junio C Hamano authored
26 . git-sh-setup
ccb3650 Allow "git repack" users to specify repacking window/depth
Linus Torvalds authored
27
ca11b21 let pack-objects do the writing of unreachable objects as loose objects
Nicolas Pitre authored
28 no_update_info= all_into_one= remove_redundant= unpack_unreachable=
2e6a30e @bebarino submodule, repack: migrate to git-sh-setup's say()
bebarino authored
29 local= no_reuse= extra=
822f7c7 Supplant the "while case ... break ;; esac" idiom
David Kastrup authored
30 while test $# != 0
ccf1ee3 Generate pack info file after repack.
Junio C Hamano authored
31 do
32 case "$1" in
33 -n) no_update_info=t ;;
d5acdcf git-repack-script: Add option to repack all objects.
Junio C Hamano authored
34 -a) all_into_one=t ;;
65aa530 @gitster repack -A -d: use --keep-unreachable when repacking
gitster authored
35 -A) all_into_one=t
ca11b21 let pack-objects do the writing of unreachable objects as loose objects
Nicolas Pitre authored
36 unpack_unreachable=--unpack-unreachable ;;
7e52f56 @peff gc: do not explode objects which will be immediately pruned
peff authored
37 --unpack-unreachable)
38 unpack_unreachable="--unpack-unreachable=$2"; shift ;;
0adb335 @ralfbaechle git-repack: Fix variable name
ralfbaechle authored
39 -d) remove_redundant=t ;;
2e6a30e @bebarino submodule, repack: migrate to git-sh-setup's say()
bebarino authored
40 -q) GIT_QUIET=t ;;
5c47e1c @jast repack: add -F flag to let user choose between --no-reuse-delta/object
jast authored
41 -f) no_reuse=--no-reuse-delta ;;
42 -F) no_reuse=--no-reuse-object ;;
cec2be7 git-repack: allow passing a couple of flags to pack-objects.
Junio C Hamano authored
43 -l) local=--local ;;
5715d0b @MadCoder Migrate git-repack.sh to use git-rev-parse --parseopt
MadCoder authored
44 --max-pack-size|--window|--window-memory|--depth)
45 extra="$extra $1=$2"; shift ;;
46 --) shift; break;;
9678faa git-repack: Usage string clean-up, emit usage at incorrect invocation
freku045@student.liu.se authored
47 *) usage ;;
ccf1ee3 Generate pack info file after repack.
Junio C Hamano authored
48 esac
49 shift
50 done
51
22c79ea repack.usedeltabaseoffset config option now defaults to "true"
Nicolas Pitre authored
52 case "`git config --bool repack.usedeltabaseoffset || echo true`" in
b6945f5 git-repack: repo.usedeltabaseoffset
Junio C Hamano authored
53 true)
54 extra="$extra --delta-base-offset" ;;
55 esac
56
d5acdcf git-repack-script: Add option to repack all objects.
Junio C Hamano authored
57 PACKDIR="$GIT_OBJECT_DIRECTORY/pack"
e32dfec @trast repack: place temporary packs under .git/objects/pack/
trast authored
58 PACKTMP="$PACKDIR/.tmp-$$-pack"
0ea2582 git-repack: create new packs inside $GIT_DIR, not cwd
Martin Langhoff authored
59 rm -f "$PACKTMP"-*
60 trap 'rm -f "$PACKTMP"-*' 0 1 2 3 15
d5acdcf git-repack-script: Add option to repack all objects.
Junio C Hamano authored
61
62 # There will be more repacking strategies to come...
63 case ",$all_into_one," in
64 ,,)
cd0d74d repack: use only pack-objects, not rev-list.
Junio C Hamano authored
65 args='--unpacked --incremental'
d5acdcf git-repack-script: Add option to repack all objects.
Junio C Hamano authored
66 ;;
67 ,t,)
2478dc8 @gitster git-repack: resist stray environment variable
gitster authored
68 args= existing=
ce85907 @spearce Only repack active packs by skipping over kept packs.
spearce authored
69 if [ -d "$PACKDIR" ]; then
70 for e in `cd "$PACKDIR" && find . -type f -name '*.pack' \
71 | sed -e 's/^\.\///' -e 's/\.pack$//'`
72 do
73 if [ -e "$PACKDIR/$e.keep" ]; then
74 : keep
75 else
76 existing="$existing $e"
77 fi
78 done
171110a git-repack.sh: don't use --kept-pack-only option to pack-objects
Brandon Casey authored
79 if test -n "$existing" -a -n "$unpack_unreachable" -a \
83d0289 repack: only unpack-unreachable if we are deleting redundant packs
Brandon Casey authored
80 -n "$remove_redundant"
f7991d1 repack: do not fall back to incremental repacking with [-a|-A]
Brandon Casey authored
81 then
7e52f56 @peff gc: do not explode objects which will be immediately pruned
peff authored
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 ' ' .)"
f7991d1 repack: do not fall back to incremental repacking with [-a|-A]
Brandon Casey authored
88 fi
65aa530 @gitster repack -A -d: use --keep-unreachable when repacking
gitster authored
89 fi
d5acdcf git-repack-script: Add option to repack all objects.
Junio C Hamano authored
90 ;;
91 esac
0ea2582 git-repack: create new packs inside $GIT_DIR, not cwd
Martin Langhoff authored
92
e32dfec @trast repack: place temporary packs under .git/objects/pack/
trast authored
93 mkdir -p "$PACKDIR" || exit
94
2e6a30e @bebarino submodule, repack: migrate to git-sh-setup's say()
bebarino authored
95 args="$args $local ${GIT_QUIET:+-q} $no_reuse$extra"
7f3140c @dscho git repack: keep commits hidden by a graft
dscho authored
96 names=$(git pack-objects --keep-true-parents --honor-pack-keep --non-empty --all --reflog $args </dev/null "$PACKTMP") ||
b2d4619 Add "git repack" command that does an incremental pack
Linus Torvalds authored
97 exit 1
6b94b1a git-repack --max-pack-size: add option parsing to enable feature
Dana L. How authored
98 if [ -z "$names" ]; then
2e6a30e @bebarino submodule, repack: migrate to git-sh-setup's say()
bebarino authored
99 say Nothing new to pack.
6b94b1a git-repack --max-pack-size: add option parsing to enable feature
Dana L. How authored
100 fi
d5acdcf git-repack-script: Add option to repack all objects.
Junio C Hamano authored
101
3e6b1d0 @gitster Make repack less likely to corrupt repository
gitster authored
102 # Ok we have prepared all new packfiles.
103
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.
107 rollback=
108 failed=
109 for name in $names
110 do
2ad47d6 git-repack: Be careful when updating the same pack as an existing one.
Junio C Hamano authored
111 for sfx in pack idx
112 do
3e6b1d0 @gitster Make repack less likely to corrupt repository
gitster authored
113 file=pack-$name.$sfx
114 test -f "$PACKDIR/$file" || continue
115 rm -f "$PACKDIR/old-$file" &&
116 mv "$PACKDIR/$file" "$PACKDIR/old-$file" || {
117 failed=t
118 break
119 }
120 rollback="$rollback $file"
121 done
122 test -z "$failed" || break
123 done
124
125 # If renaming failed for any of them, roll the ones we have
126 # already renamed back to their original names.
127 if test -n "$failed"
128 then
129 rollback_failure=
130 for file in $rollback
131 do
132 mv "$PACKDIR/old-$file" "$PACKDIR/$file" ||
133 rollback_failure="$rollback_failure $file"
134 done
135 if test -n "$rollback_failure"
136 then
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
145 do
146 echo >&2 "WARNING: old-$file -> $file"
147 done
148 fi
149 exit 1
150 fi
151
152 # Now the ones with the same name are out of the way...
153 fullbases=
154 for name in $names
155 do
156 fullbases="$fullbases pack-$name"
157 chmod a-w "$PACKTMP-$name.pack"
158 chmod a-w "$PACKTMP-$name.idx"
0ea2582 git-repack: create new packs inside $GIT_DIR, not cwd
Martin Langhoff authored
159 mv -f "$PACKTMP-$name.pack" "$PACKDIR/pack-$name.pack" &&
3e6b1d0 @gitster Make repack less likely to corrupt repository
gitster authored
160 mv -f "$PACKTMP-$name.idx" "$PACKDIR/pack-$name.idx" ||
161 exit
162 done
163
164 # Remove the "old-" files
165 for name in $names
166 do
167 rm -f "$PACKDIR/old-pack-$name.idx"
168 rm -f "$PACKDIR/old-pack-$name.pack"
6b94b1a git-repack --max-pack-size: add option parsing to enable feature
Dana L. How authored
169 done
d5acdcf git-repack-script: Add option to repack all objects.
Junio C Hamano authored
170
3e6b1d0 @gitster Make repack less likely to corrupt repository
gitster authored
171 # End of pack replacement.
172
0adb335 @ralfbaechle git-repack: Fix variable name
ralfbaechle authored
173 if test "$remove_redundant" = t
d5acdcf git-repack-script: Add option to repack all objects.
Junio C Hamano authored
174 then
ce85907 @spearce Only repack active packs by skipping over kept packs.
spearce authored
175 # We know $existing are all redundant.
176 if [ -n "$existing" ]
62af0b5 Remove all old packfiles when doing "git repack -a -d"
Lukas Sandström authored
177 then
6ed6405 git-repack: do not do complex redundancy check.
Junio C Hamano authored
178 ( cd "$PACKDIR" &&
179 for e in $existing
180 do
dca3957 Ensure git-repack -a -d --max-pack-size=N deletes correct packs
Dana How authored
181 case " $fullbases " in
182 *" $e "*) ;;
ce85907 @spearce Only repack active packs by skipping over kept packs.
spearce authored
183 *) rm -f "$e.pack" "$e.idx" "$e.keep" ;;
62af0b5 Remove all old packfiles when doing "git repack -a -d"
Lukas Sandström authored
184 esac
6ed6405 git-repack: do not do complex redundancy check.
Junio C Hamano authored
185 done
186 )
d5acdcf git-repack-script: Add option to repack all objects.
Junio C Hamano authored
187 fi
2e6a30e @bebarino submodule, repack: migrate to git-sh-setup's say()
bebarino authored
188 git prune-packed ${GIT_QUIET:+-q}
d5acdcf git-repack-script: Add option to repack all objects.
Junio C Hamano authored
189 fi
ccf1ee3 Generate pack info file after repack.
Junio C Hamano authored
190
191 case "$no_update_info" in
192 t) : ;;
e1dc49b @toofishes git-repack: use non-dashed update-server-info
toofishes authored
193 *) git update-server-info ;;
ccf1ee3 Generate pack info file after repack.
Junio C Hamano authored
194 esac
Something went wrong with that request. Please try again.