Re: 'HEAD' is not a commit (according to git-checkout)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Am 21.05.20 um 21:16 schrieb Jeff King:
> Something like this works:
>
> diff --git a/builtin/checkout.c b/builtin/checkout.c
> index e9d111bb83..6559ac666b 100644
> --- a/builtin/checkout.c
> +++ b/builtin/checkout.c
> @@ -1553,6 +1553,7 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
>  {
>  	struct branch_info new_branch_info;
>  	int parseopt_flags = 0;
> +	int got_start_point = 0;
>
>  	memset(&new_branch_info, 0, sizeof(new_branch_info));
>  	opts->overwrite_ignore = 1;
> @@ -1661,6 +1662,8 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
>  			!opts->new_branch;
>  		int n = parse_branchname_arg(argc, argv, dwim_ok,
>  					     &new_branch_info, opts, &rev);
> +		if (n)
> +			got_start_point = 1;
>  		argv += n;
>  		argc -= n;
>  	} else if (!opts->accept_ref && opts->from_treeish) {
> @@ -1689,7 +1692,7 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
>  		 * Try to give more helpful suggestion.
>  		 * new_branch && argc > 1 will be caught later.
>  		 */
> -		if (opts->new_branch && argc == 1)
> +		if (opts->new_branch && !got_start_point && argc == 1)
>  			die(_("'%s' is not a commit and a branch '%s' cannot be created from it"),
>  				argv[0], opts->new_branch);
>
>
> to produce:
>
>   $ git checkout -b work -t master HEAD
>   fatal: '--track' cannot be used with updating paths
>
>   $ git checkout -b work master HEAD
>   fatal: Cannot update paths and switch to branch 'work' at the same time.
>
> which are both correct. I wonder if there's a more elegant way to do it,
> though (probably not, as there's definitely some heuristic parsing going
> on to determine which checkout mode we're in; the new switch/restore
> alternatives don't suffer as much from this).

Perhaps:

diff --git a/builtin/checkout.c b/builtin/checkout.c
index e9d111bb83..24336e1017 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -1689,7 +1689,7 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
 		 * Try to give more helpful suggestion.
 		 * new_branch && argc > 1 will be caught later.
 		 */
-		if (opts->new_branch && argc == 1)
+		if (opts->new_branch && argc == 1 && !new_branch_info.commit)
 			die(_("'%s' is not a commit and a branch '%s' cannot be created from it"),
 				argv[0], opts->new_branch);





[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux