Under certain circumstances, commits that were reachable can be made unreachable, e.g. via `git fetch --prune`. These commits might have been packed already, in which case `git repack -adlf` will just drop them without giving them the usual grace period before an eventual `git prune` (via `git gc`) prunes them. This is a problem when the `shallow` file still lists them, which is the reason why `git prune` edits that file. And with the proposed changes, `git repack -ad` will now do the same. Reported by Alejandro Pauly. Changes since v1: - Also trigger `prune_shallow()` when `--unpack-unreachable=<approxidate>` was passed to `git repack`. - No need to trigger `prune_shallow()` when `git repack` was called with `-k`. Johannes Schindelin (2): repack: point out a bug handling stale shallow info repack -ad: prune the list of shallow commits builtin/repack.c | 6 ++++++ t/t5537-fetch-shallow.sh | 27 +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) base-commit: e3331758f12da22f4103eec7efe1b5304a9be5e9 Published-As: https://github.com/gitgitgadget/git/releases/tags/pr-9%2Fdscho%2Fshallow-and-fetch-prune-v2 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-9/dscho/shallow-and-fetch-prune-v2 Pull-Request: https://github.com/gitgitgadget/git/pull/9 Range-diff vs v1: 1: d2be40131 = 1: d2be40131 repack: point out a bug handling stale shallow info 2: b4e01a963 ! 2: c7ee6e008 repack -ad: prune the list of shallow commits @@ -23,7 +23,8 @@ 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). + being deleted). Additionally, e also need to take `--keep-reachable` and + `--unpack-unreachable=<date>` into account. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> @@ -35,7 +36,9 @@ opts |= PRUNE_PACKED_VERBOSE; prune_packed_objects(opts); + -+ if (!(pack_everything & LOOSEN_UNREACHABLE) && ++ if (!keep_unreachable && ++ (!(pack_everything & LOOSEN_UNREACHABLE) || ++ unpack_unreachable) && + is_repository_shallow()) + prune_shallow(0); } -- gitgitgadget