git push default doesn't make sense
From: Felipe Contreras <hidden>
Date: 2021-05-28 21:12:55
Mathias Kunter wrote:
However, the advised "git push <name>" command won't work on that branch with the default settings of Git. To make it work, `simple` pushing would have to use `current` behavior on a branch without upstream. Please consider changing that. Thank you.
OK, after reorganizing the code to actually make it understandable [1],
I ended up with this:
if (centralized) {
if (!branch->merge_nr || !branch->merge || !branch->remote_name)
die(_("The current branch %s has no upstream branch.\n"
"To push the current branch and set the remote as upstream, use\n"
"\n"
" git push --set-upstream %s %s\n"),
branch->name,
remote->name,
branch->name);
if (branch->merge_nr != 1)
die(_("The current branch %s has multiple upstream branches, "
"refusing to push."), branch->name);
/* Additional safety */
if (strcmp(branch->refname, branch->merge[0]->src))
die_push_simple(branch, remote);
}
refspec_appendf(&rs, "%s:%s", branch->refname, branch->refname);
I agree this doesn't make sense.
If this works:
git clone $central .
...
git push
Then this should too:
git clone $central .
git checkout -b fix-1
...
git push
Cloning automatically sets up an upstream branch for "master", and
therore it passes the safety check of `push.default=simple`, and that is
much more dangerous than pushing any other branch.
Why do we barf with "fix-1", but not "master"? Doesn't make sense.
This is what we want:
if (centralized &&
(branch->merge_nr && branch->merge && branch->remote_name))
{
if (branch->merge_nr != 1)
die(_("The current branch %s has multiple upstream branches, "
"refusing to push."), branch->name);
/* Additional safety */
if (strcmp(branch->refname, branch->merge[0]->src))
die_push_simple(branch, remote);
}
refspec_appendf(&rs, "%s:%s", branch->refname, branch->refname);
In other words: `simple` should be the same as `current`, except when
there's an upstream branch configured *and* the destination branch has a
different name.
Cheers.
[1] https://lore.kernel.org/git/20210528201014.2175179-1-felipe.contreras@gmail.com/ (local)
--
Felipe Contreras