Skip to content

Commit c7ee6e0

Browse files
committed
repack -ad: prune the list of shallow commits
While it is true that we never add unreachable commits into pack files intentionally (as `git repack`'s documentation states), we must not forget that a `git fetch --prune` (or even a `git fetch` when a ref was force-pushed in the meantime) can make a commit unreachable that was reachable before. Therefore it is not safe to assume that a `git repack -adlf` will keep unreachable commits alone (under the assumption that they had not been packed in the first place). This is particularly important to keep in mind when looking at the `.git/shallow` file: if any commits listed in that file become unreachable, it is not a problem, but if they go missing, it *is* a problem. One symptom of this problem is that a deepening fetch may now fail with fatal: error in object: unshallow <commit-hash> To avoid this problem, let's prune the shallow list in `git repack` when the `-d` option is passed, unless `-A` is passed, too (which would force the now-unreachable objects to be turned into loose objects instead of being deleted). Additionally, e also need to take `--keep-reachable` and `--unpack-unreachable=<date>` into account. Signed-off-by: Johannes Schindelin <[email protected]>
1 parent d2be401 commit c7ee6e0

File tree

2 files changed

+7
-1
lines changed

2 files changed

+7
-1
lines changed

builtin/repack.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,12 @@ int cmd_repack(int argc, const char **argv, const char *prefix)
444444
if (!quiet && isatty(2))
445445
opts |= PRUNE_PACKED_VERBOSE;
446446
prune_packed_objects(opts);
447+
448+
if (!keep_unreachable &&
449+
(!(pack_everything & LOOSEN_UNREACHABLE) ||
450+
unpack_unreachable) &&
451+
is_repository_shallow())
452+
prune_shallow(0);
447453
}
448454

449455
if (!no_update_server_info)

t/t5537-fetch-shallow.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ EOF
186186
test_cmp expect actual
187187
'
188188

189-
test_expect_failure '.git/shallow is edited by repack' '
189+
test_expect_success '.git/shallow is edited by repack' '
190190
git init shallow-server &&
191191
test_commit -C shallow-server A &&
192192
test_commit -C shallow-server B &&

0 commit comments

Comments
 (0)