HEAD is not explicitly used as a starting commit for calculating reachability, so if it's detached and reflogs are disabled it may be pruned. Add test which demonstrates it. Signed-off-by: Max Kirillov <max@xxxxxxxxxx> --- Hi. This is a followup of http://thread.gmane.org/gmane.comp.version-control.git/255996 I digged it a bit more and look what I found! Actually, I think would be nice if someone familiar with the code greps for for_each_ref() usage and for each case verify if head should be added. reachable.c | 3 +++ t/t5312-prune-detached.sh | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100755 t/t5312-prune-detached.sh diff --git a/reachable.c b/reachable.c index 654a8c5..6f6835b 100644 --- a/reachable.c +++ b/reachable.c @@ -229,6 +229,9 @@ void mark_reachable_objects(struct rev_info *revs, int mark_reflog, /* Add all external refs */ for_each_ref(add_one_ref, revs); + /* detached HEAD is not included in the list above */ + head_ref(add_one_ref, revs); + /* Add all reflog info */ if (mark_reflog) for_each_reflog(add_one_reflog, revs); diff --git a/t/t5312-prune-detached.sh b/t/t5312-prune-detached.sh new file mode 100755 index 0000000..fac93e1 --- /dev/null +++ b/t/t5312-prune-detached.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +test_description='no prune detached head without reflog' +. ./test-lib.sh + +test_expect_success 'make repo' ' + git config core.logAllRefUpdates false + git commit --allow-empty -m commit1 && + git commit --allow-empty -m commit2 && + git checkout --detach master && + git commit --allow-empty -m commit3 +' + +test_expect_success 'prune does not delete anything' ' + git prune -n >prune_actual && + : >prune_expected && + test_cmp prune_expected prune_actual' + +test_done -- 2.0.1.1697.g73c6810 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html