Henrik Austad <henrik@xxxxxxxxx> writes: > On Friday 02 January 2009 22:44:50 Junio C Hamano wrote: >> Henrik Austad <henrik@xxxxxxxxx> writes: >> > I recently tried to do a checkout of (what I thought was the first) inux >> > kernel in the linux git repo. >> > >> > git checkout -b 2.6.11 v2.6.11 >> >> This should have barfed, and indeed I think it is a regression around >> v1.5.5. v1.5.4 and older git definitely fails to check out a tree object >> like that. > > You're right, I bisected it down to commit > 782c2d65c24066a5d83453efb52763bc34c10f81 I am not surprised. That one discarded an implementation of "git checkout" in Bourne shell, with a complete reimplementation in C. I haven't looked at the code very closely, but I think this should fix it. Thorough reviewing (not just running the test suite) is much appreciated. -- >8 -- Subject: git-checkout: do not allow switching to a tree-ish "git checkout -b newbranch $commit^{tree}" mistakenly created a new branch rooted at the current HEAD, because in that case, the two structure fields used to see if the command was invoked without any argument (hence it needs to default to checking out the HEAD), were populated incorrectly. Upon seeing a command line argument that we took as a rev, we should store that string in new.name, even if that does not name a commit. Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> --- builtin-checkout.c | 2 +- t/t2011-checkout-invalid-head.sh | 4 ++++ 2 files changed, 5 insertions(+), 1 deletions(-) diff --git c/builtin-checkout.c w/builtin-checkout.c index c2c0561..b5dd9c0 100644 --- c/builtin-checkout.c +++ w/builtin-checkout.c @@ -681,8 +681,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) argv++; argc--; + new.name = arg; if ((new.commit = lookup_commit_reference_gently(rev, 1))) { - new.name = arg; setup_branch_path(&new); if (resolve_ref(new.path, rev, 1, NULL)) new.commit = lookup_commit_reference(rev); diff --git c/t/t2011-checkout-invalid-head.sh w/t/t2011-checkout-invalid-head.sh index 764bb0a..798790d 100755 --- c/t/t2011-checkout-invalid-head.sh +++ w/t/t2011-checkout-invalid-head.sh @@ -15,4 +15,8 @@ test_expect_success 'checkout master from invalid HEAD' ' git checkout master -- ' +test_expect_success 'checkout should not start branch from a tree' ' + test_must_fail git checkout -b newbranch master^{tree} +' + test_done -- 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