On Sat, Jul 13, 2013 at 01:08:09PM -0700, Junio C Hamano wrote: > Junio C Hamano <gitster@xxxxxxxxx> writes: > > > If "--lockref" automatically implies "--allow-no-ff" (the design in > > the reposted patch), you cannot express that combination. But once > > you use "--lockref" in such a situation , for the push to succeed, > > you know that the push replaces not just _any_ ancestor of what you > > are pushing, but replaces the exact current value. So I do not think > > your implicit introduction of --allow-no-ff via redefining the > > semantics of the plus prefix is not adding much value (if any), > > while making the common case less easy to use. > > > >> No; --lockref only adds the check that the destination is at the > >> expected revision, but does *NOT* override the no-ff check. > > > > You _could_ do it in that way, but that is less useful. > > Another issue I have with the proposal is that we close the door to > "force only this one" convenience we have with "+ref" vs "--force > ref". Assuming that it is useful to require lockref while still > making sure that the usual "must fast-forward" rule is followed (if > that is not the case, I do not see a reason why your proposal is any > useful---am I missing something?), I would prefer to allow users a > way to decorate this basic syntax to say: > > git push --lockref master jch pu > > things like > > (1) pu may not fast-forward and please override that "must > fast-forward" check from it, while still keeping the lockref > safety (e.g. "+pu" that does not --force, which is your > proposal); > > (2) any of them may not fast-forward and please override that "must > fast-forward" check from it, while still keeping the lockref > safety (without adding "--allow-no-ff", I do not see how it is > possible with your proposal, short of forcing user to add "+" > everywhere); > > (3) I know jch does not fast-forward so please override the "must > fast-forward", but still apply the lockref safety, pu may not > even satisfy lockref safety so please force it (as the "only > force this one" semantics is removed from "+", I do not see how > it is possible with your proposal). I haven't been following this thread too closely, but I was assuming that the interface would be something like this: git push origin +master git push --force origin master mean the same thing and do what they do now. git push origin *master git push --lockref origin master both mean the same thing: using the new compare-and-swap mode only update master if the remote side corresponds to remotes/origin/master [1]. git push origin *master:refs/heads/master:@{1} means to push the local ref master to the remote ref refs/heads/master if it currently points at "@{1}". In this scenario, giving both --lockref and --force should be an error because the user is probably confused (the obvious interpretation is that --force wins, but I don't think that's sensible). I'm not sure what should happen with: git push --force origin *master where it appears that the user is asking for a compare-and-swap update of master but the --force is overriding this. I think we have to let --force win because when the refspec comes from remote.<name>.push we have to let the command-line --force override the specified behaviour. I don't particularly like the name --lockref, the original --cas feels more descriptive to me. [1] In fact, I suspect this would have to be "the ref that refs/heads/master maps to using remote.origin.fetch". -- 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