summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2014-09-29 22:10:04 -0700
committerJunio C Hamano <gitster@pobox.com>2014-09-29 22:10:04 -0700
commit421ec4f8d1f616ba3cb82204e9973be45b61eea0 (patch)
tree1e10a75548a514ba5be98dd3431c1e0713ee9f07
parent5b830a8588f7d20a18e9ce7c886085ddfd7127d7 (diff)
parentc40fdd01dd120c8c63da5e830ccdeb1518434bd6 (diff)
downloadgit-421ec4f8d1f616ba3cb82204e9973be45b61eea0.tar.gz
Merge branch 'mk/reachable-protect-detached-head' into maint
Reachability check (used in "git prune" and friends) did not add a detached HEAD as a starting point to traverse objects still in use. * mk/reachable-protect-detached-head: reachable.c: add HEAD to reachability starting commits
-rw-r--r--reachable.c3
-rwxr-xr-xt/t5304-prune.sh22
2 files changed, 25 insertions, 0 deletions
diff --git a/reachable.c b/reachable.c
index 654a8c58d6..6f6835bf27 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/t5304-prune.sh b/t/t5304-prune.sh
index 377d3d3899..01c6a3fc1d 100755
--- a/t/t5304-prune.sh
+++ b/t/t5304-prune.sh
@@ -104,6 +104,28 @@ test_expect_success 'prune: prune unreachable heads' '
'
+test_expect_success 'prune: do not prune detached HEAD with no reflog' '
+
+ git checkout --detach --quiet &&
+ git commit --allow-empty -m "detached commit" &&
+ # verify that there is no reflogs
+ # (should be removed and disabled by previous test)
+ test ! -e .git/logs &&
+ git prune -n >prune_actual &&
+ : >prune_expected &&
+ test_cmp prune_actual prune_expected
+
+'
+
+test_expect_success 'prune: prune former HEAD after checking out branch' '
+
+ head_sha1=$(git rev-parse HEAD) &&
+ git checkout --quiet master &&
+ git prune -v >prune_actual &&
+ grep "$head_sha1" prune_actual
+
+'
+
test_expect_success 'prune: do not prune heads listed as an argument' '
: > file2 &&