Allow git-checkout when on a non-existant branch.
I've seen some users get into situtations where their HEAD symbolic-ref is pointing at a non-existant ref. (Sometimes this happens during clone when the remote repository lacks a 'master' branch.) If this happens the user is unable to use git-checkout to switch branches as there is no prior commit to merge from. So instead of giving the user low-level errors about how HEAD can't be resolved and how not a single revision was given change the type of checkout to be a force and go through with the user's request anyway. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
4a0641b7cf
commit
5a03e7f253
@ -4,8 +4,8 @@ USAGE='[-f] [-b <new_branch>] [-m] [<branch>] [<paths>...]'
|
|||||||
SUBDIRECTORY_OK=Sometimes
|
SUBDIRECTORY_OK=Sometimes
|
||||||
. git-sh-setup
|
. git-sh-setup
|
||||||
|
|
||||||
old=$(git-rev-parse HEAD)
|
|
||||||
old_name=HEAD
|
old_name=HEAD
|
||||||
|
old=$(git-rev-parse --verify $old_name 2>/dev/null)
|
||||||
new=
|
new=
|
||||||
new_name=
|
new_name=
|
||||||
force=
|
force=
|
||||||
@ -139,6 +139,13 @@ fi
|
|||||||
die "git checkout: to checkout the requested commit you need to specify
|
die "git checkout: to checkout the requested commit you need to specify
|
||||||
a name for a new branch which is created and switched to"
|
a name for a new branch which is created and switched to"
|
||||||
|
|
||||||
|
if [ "X$old" = X ]
|
||||||
|
then
|
||||||
|
echo "warning: You do not appear to currently be on a branch." >&2
|
||||||
|
echo "warning: Forcing checkout of $new_name." >&2
|
||||||
|
force=1
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$force" ]
|
if [ "$force" ]
|
||||||
then
|
then
|
||||||
git-read-tree --reset -u $new
|
git-read-tree --reset -u $new
|
||||||
|
@ -31,6 +31,15 @@ test_expect_success setup '
|
|||||||
git checkout master
|
git checkout master
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success "checkout from non-existing branch" '
|
||||||
|
|
||||||
|
git checkout -b delete-me master &&
|
||||||
|
rm .git/refs/heads/delete-me &&
|
||||||
|
test refs/heads/delete-me = "$(git symbolic-ref HEAD)" &&
|
||||||
|
git checkout master &&
|
||||||
|
test refs/heads/master = "$(git symbolic-ref HEAD)"
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success "checkout with dirty tree without -m" '
|
test_expect_success "checkout with dirty tree without -m" '
|
||||||
|
|
||||||
fill 0 1 2 3 4 5 >one &&
|
fill 0 1 2 3 4 5 >one &&
|
||||||
|
Loading…
Reference in New Issue
Block a user