* error with $ git push origin HEAD:newbranch @ 2011-05-05 8:47 chris 2011-05-05 9:37 ` Jeff King 0 siblings, 1 reply; 11+ messages in thread From: chris @ 2011-05-05 8:47 UTC (permalink / raw) To: git $ git push origin HEAD:newbranch error: unable to push to unqualified destination: newbranch The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'ssh://example.com/srv/git/project.git' This worked previously[1]. Local git version 1.7.5, remote git version 1.7.2.3. 1. I recently upgraded locally from 1.7.4.x ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: error with $ git push origin HEAD:newbranch 2011-05-05 8:47 error with $ git push origin HEAD:newbranch chris @ 2011-05-05 9:37 ` Jeff King 2011-05-05 10:06 ` chris 0 siblings, 1 reply; 11+ messages in thread From: Jeff King @ 2011-05-05 9:37 UTC (permalink / raw) To: chris; +Cc: git On Thu, May 05, 2011 at 08:47:39AM +0000, chris wrote: > $ git push origin HEAD:newbranch > error: unable to push to unqualified destination: newbranch > The destination refspec neither matches an existing ref on the remote nor > begins with refs/, and we are unable to guess a prefix based on the source ref. > error: failed to push some refs to 'ssh://example.com/srv/git/project.git' > > This worked previously[1]. Local git version 1.7.5, remote git version 1.7.2.3. > > 1. I recently upgraded locally from 1.7.4.x I can't replicate here, using this snippet: git init --bare parent && git clone parent child && (cd child && echo content >file && git add file && git commit -m one && git push origin HEAD:newbranch ) However, you may see that message if you are on a detached head instead of a branch. Might that be the case here? -Peff ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: error with $ git push origin HEAD:newbranch 2011-05-05 9:37 ` Jeff King @ 2011-05-05 10:06 ` chris 2011-05-05 10:59 ` Jeff King 0 siblings, 1 reply; 11+ messages in thread From: chris @ 2011-05-05 10:06 UTC (permalink / raw) To: git Jeff King <peff <at> peff.net> writes: > On Thu, May 05, 2011 at 08:47:39AM +0000, chris wrote: > > > $ git push origin HEAD:newbranch > > error: unable to push to unqualified destination: newbranch > > The destination refspec neither matches an existing ref on the remote nor > > begins with refs/, and we are unable to guess a prefix based on the source ref. > > error: failed to push some refs to 'ssh://example.com/srv/git/project.git' > > ... > However, you may see that message if you are on a detached head instead > of a branch. Might that be the case here? Yes, indeed. I suppose it must be the situation that I've never done that before then. While I certainly I have pushed a detached head before, it must have always been to an existing branch. Thanks for clarifying this. It is slightly surprising that git-push doesn't default to assuming one means refs/heads/newbranch in this case. I don't see a reason not to? chris ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: error with $ git push origin HEAD:newbranch 2011-05-05 10:06 ` chris @ 2011-05-05 10:59 ` Jeff King 2011-05-06 2:16 ` chris 0 siblings, 1 reply; 11+ messages in thread From: Jeff King @ 2011-05-05 10:59 UTC (permalink / raw) To: chris; +Cc: git On Thu, May 05, 2011 at 10:06:21AM +0000, chris wrote: > Yes, indeed. I suppose it must be the situation that I've never done that > before then. While I certainly I have pushed a detached head before, it must > have always been to an existing branch. > > Thanks for clarifying this. > > It is slightly surprising that git-push doesn't default to assuming one means > refs/heads/newbranch in this case. I don't see a reason not to? Consider something like: $ git checkout v1.5 $ git push origin HEAD:foo Would you want "foo" to be a branch or a tag? I can see arguments for either. Rather than trying to guess, it's fairly easy to disambiguate. For a branch, either: $ git push origin HEAD:refs/heads/foo or $ git branch foo $ git push origin HEAD would work, depending on whether or not you want a local branch. -Peff ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: error with $ git push origin HEAD:newbranch 2011-05-05 10:59 ` Jeff King @ 2011-05-06 2:16 ` chris 2011-05-06 4:56 ` Junio C Hamano 2011-05-06 17:02 ` Jeff King 0 siblings, 2 replies; 11+ messages in thread From: chris @ 2011-05-06 2:16 UTC (permalink / raw) To: git Jeff King <peff <at> peff.net> writes: > > On Thu, May 05, 2011 at 10:06:21AM +0000, chris wrote: > > > It is slightly surprising that git-push doesn't default to assuming > > one means refs/heads/newbranch in this case. I don't see a reason > > not to? > > Consider something like: > > $ git checkout v1.5 > $ git push origin HEAD:foo > > Would you want "foo" to be a branch or a tag? I can see arguments for > either. If the above command wanted to produce a tag, just provide 'v1.5' as the source ref. It seems to me that first checking out the tag then pushing from HEAD is extra steps in order to push a branch ref without having to be explicit about it. $ git push origin v1.5:foo would have been simpler if intending to push a tag ref. Given that git-push has specific syntax for pushing a tag, and git-push makes other assumptions that give the perception it is generally used for branches unless told otherwise also makes me expect that "foo" to be a branch. The following is provided for specifically calling out a tag: $ git push origin tag <refspec> However, that syntax as far as I can tell is pretty worthless anyway, as the following will not work: $ git push origin tag HEAD:newtag error: src refspec refs/tags/HEAD does not match any. $ git push origin tag 183c65e:newtag error: src refspec refs/tags/183c65e does not match any. But both the following are successful, which makes me ask why the 'tag' option exists if the above doesn't work. $ git push tag existingtag:newtag1 $ git push existingtag:newtag2 So I see little purpose in the $ git push tag <refspec> syntax, as the source must already be a tag anyway. All of that to say, it isn't exactly clear what one should expect. Personally, I would prefer that git-push work on branches by default[1], providing shortcuts for pushing tag[2] refs and remote branch[3] refs, while all other ref types must be called out explicitly. Creating new refs isn't destructive, so it seems these could be supported without concern. 1. $ git push origin SHA1:branch1 => $ git push origin SHA1:refs/heads/branch1 2. $ git push origin tag SHA1:tagname => $ git push origin SHA1:refs/tags/tagname 3. $ git push origin SHA1:upstream/branch2 => $ git push origin SHA1:refs/remotes/upstream/branch2 chris ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: error with $ git push origin HEAD:newbranch 2011-05-06 2:16 ` chris @ 2011-05-06 4:56 ` Junio C Hamano 2011-05-06 6:35 ` chris 2011-05-06 17:02 ` Jeff King 1 sibling, 1 reply; 11+ messages in thread From: Junio C Hamano @ 2011-05-06 4:56 UTC (permalink / raw) To: chris; +Cc: git chris <jugg@hotmail.com> writes: > All of that to say, it isn't exactly clear what one should expect. The take-home lesson is that if you want to be explicit and exactly clear, you can and should spell things out in full, and you can sleep well at night if you did so. # Let's call retroactively v1.5 without the last three topic # merges the v1.4.9 release... $ git push origin v1.5~3:refs/tags/v1.4.9 ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: error with $ git push origin HEAD:newbranch 2011-05-06 4:56 ` Junio C Hamano @ 2011-05-06 6:35 ` chris 0 siblings, 0 replies; 11+ messages in thread From: chris @ 2011-05-06 6:35 UTC (permalink / raw) To: git Junio C Hamano <gitster <at> pobox.com> writes: > > chris <jugg <at> hotmail.com> writes: > > > All of that to say, it isn't exactly clear what one should expect. > > The take-home lesson is that if you want to be explicit and exactly clear, > you can and should spell things out in full, and you can sleep well at > night if you did so. Yes, in order to be clear, one should be explicit. But that was never in question here. The discussion revolved around the non-explicit refspec usage with git-push. And certainly there seems to have been attempts in the past to provide sensible short-hand usage for the command, but it would appear the accumulation lacks consistency. If the expectation is that one should always be explicit, then I assume the short-hand will begin to become deprecated? If not, then discussing it and improving it where possible seems rather acceptable. chris ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: error with $ git push origin HEAD:newbranch 2011-05-06 2:16 ` chris 2011-05-06 4:56 ` Junio C Hamano @ 2011-05-06 17:02 ` Jeff King 2011-05-10 15:34 ` chris 1 sibling, 1 reply; 11+ messages in thread From: Jeff King @ 2011-05-06 17:02 UTC (permalink / raw) To: chris; +Cc: git On Fri, May 06, 2011 at 02:16:03AM +0000, chris wrote: > Jeff King <peff <at> peff.net> writes: > > > > On Thu, May 05, 2011 at 10:06:21AM +0000, chris wrote: > > > > > It is slightly surprising that git-push doesn't default to assuming > > > one means refs/heads/newbranch in this case. I don't see a reason > > > not to? > > > > Consider something like: > > > > $ git checkout v1.5 > > $ git push origin HEAD:foo > > > > Would you want "foo" to be a branch or a tag? I can see arguments for > > either. > > If the above command wanted to produce a tag, just provide 'v1.5' as the source > ref. It seems to me that first checking out the tag then pushing from HEAD is > extra steps in order to push a branch ref without having to be explicit about > it. $ git push origin v1.5:foo would have been simpler if intending to push a > tag ref. Sure, but that was just a small example. It could just as easily have been: $ git checkout v1.5 ... look look look ... ... hmm, this one doesn't have the bug or feature I'm looking for ... $ git checkout v1.5.1 ... look look look ... ... nor this one ... $ git checkout v1.5.2 ... look look look ... ... oh, this one has it, let's push it upstream to communicate to somebody ... $ git push origin HEAD:foo Sure, I _could_ say "git push origin v1.5.2:foo" in the final step. But my mental model is "I have found the thing I am looking for, now push it", which means HEAD is more natural. This is more obvious to see when you start leaving refs, like: $ git checkout HEAD^ ... look look look; nope ... $ git checkout HEAD^ ... look look look; nope ... $ git checkout HEAD^ ... yep, found it ... $ git push origin HEAD:foo So in both of those cases, what should be pushed? A tag or a branch? My argument is that git would have to guess. Rather than guess, we come back to the user and say "please be more specific". > Given that git-push has specific syntax for pushing a tag, and git-push makes > other assumptions that give the perception it is generally used for branches > unless told otherwise also makes me expect that "foo" to be a branch. That tag syntax is antique and predates most of the nice DWIM behavior of refspecs. Nowadays you can just say "git push <remote> v1.5" and it will do the same thing without the "tag" modifier. So I doubt anyone uses it. I wonder if we should more clearly mark it as useless in the documentation. > The following is provided for specifically calling out a tag: > > $ git push origin tag <refspec> > > However, that syntax as far as I can tell is pretty worthless anyway, as the > following will not work: > > $ git push origin tag HEAD:newtag > error: src refspec refs/tags/HEAD does not match any. > > $ git push origin tag 183c65e:newtag > error: src refspec refs/tags/183c65e does not match any. Right. It's literally about expanding "tag foo" into "refs/tags/foo:refs/tags/foo". So it only works for a tag ref. For both of those, you would need: git push origin HEAD:refs/tags/newtag git push origin 183c65e:refs/tags/newtag > But both the following are successful, which makes me ask why the 'tag' option > exists if the above doesn't work. > > $ git push tag existingtag:newtag1 > > $ git push existingtag:newtag2 > > So I see little purpose in the $ git push tag <refspec> syntax, as the source > must already be a tag anyway. Right. Once upon a time, that didn't Just Work. These days we see that the LHS of the refspec is a tag, and infer that the RHS should be, as well (in the absence of anything more specific). > Personally, I would prefer that git-push work on branches by default[1], > providing shortcuts for pushing tag[2] refs and remote branch[3] refs, while all > other ref types must be called out explicitly. Creating new refs isn't > destructive, so it seems these could be supported without concern. > > 1. $ git push origin SHA1:branch1 > => $ git push origin SHA1:refs/heads/branch1 > > 2. $ git push origin tag SHA1:tagname > => $ git push origin SHA1:refs/tags/tagname > > 3. $ git push origin SHA1:upstream/branch2 > => $ git push origin SHA1:refs/remotes/upstream/branch2 In (3), how do you differentiate between the branch "refs/heads/upstream/branch2" and the remote tracking branch "refs/remotes/upstream/branches"? -Peff ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: error with $ git push origin HEAD:newbranch 2011-05-06 17:02 ` Jeff King @ 2011-05-10 15:34 ` chris 2011-05-10 19:47 ` Jeff King 0 siblings, 1 reply; 11+ messages in thread From: chris @ 2011-05-10 15:34 UTC (permalink / raw) To: git Jeff King <peff <at> peff.net> writes: > > On Fri, May 06, 2011 at 02:16:03AM +0000, chris wrote: > > > Personally, I would prefer that git-push work on branches by default[1], > > providing shortcuts for pushing tag[2] refs and remote branch[3] refs, > > while all other ref types must be called out explicitly. Creating new refs > > isn't destructive, so it seems these could be supported without concern. > > > > 1. $ git push origin SHA1:branch1 > > => $ git push origin SHA1:refs/heads/branch1 > > > > 2. $ git push origin tag SHA1:tagname > > => $ git push origin SHA1:refs/tags/tagname > > > > 3. $ git push origin SHA1:upstream/branch2 > > => $ git push origin SHA1:refs/remotes/upstream/branch2 > > In (3), how do you differentiate between the branch > "refs/heads/upstream/branch2" and the remote tracking branch > "refs/remotes/upstream/branches"? I was just taking a queue from the documentation: -- "git push origin master:satellite/master dev:satellite/dev Use the source ref that matches master (e.g. refs/heads/master) to update the ref that matches satellite/master (most probably refs/remotes/satellite/master) in the origin repository, then do the same for dev and satellite/dev." -- Of course the documentation there is meaninging that refs/remotes/satellite/master already exists and that there is no conflicting refs/heads/satellite/master. Probably what I need to do is better understand the "guess work" git-push already does before trying to "improve" it. So, based on this thread and the documentation, the following holds true: $ git push origin HEAD:newbranch is valid only if HEAD contains a branch ref pointer. Otherwise, if the LHS of the refspec is not a known ref type, the RHS must always be explicit when pushing a new ref. If the LHS is a known ref type, then the same ref type is used for the RHS of the refspec - also the RHS becomes optional in such a case and the LHS name will be used if the RHS was omitted. If that is a correct summary (something missing?), then as is, there is little point in anything but explicit specification of the RHS of the refspec when pushing a new ref. And given that "$ git push remote tag <refspec>" syntax seems to be outdated, I don't see any benefit to my proposed set of shortcuts for pushing new refs. So, thanks Peff for the informative responses, they helped bring my understanding up a notch. chris ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: error with $ git push origin HEAD:newbranch 2011-05-10 15:34 ` chris @ 2011-05-10 19:47 ` Jeff King 2011-05-11 10:10 ` chris 0 siblings, 1 reply; 11+ messages in thread From: Jeff King @ 2011-05-10 19:47 UTC (permalink / raw) To: chris; +Cc: git On Tue, May 10, 2011 at 03:34:26PM +0000, chris wrote: > I was just taking a queue from the documentation: > > -- > "git push origin master:satellite/master dev:satellite/dev > > Use the source ref that matches master (e.g. refs/heads/master) to update the > ref that matches satellite/master (most probably refs/remotes/satellite/master) > in the origin repository, then do the same for dev and satellite/dev." > -- > > Of course the documentation there is meaninging that > refs/remotes/satellite/master already exists and that there is no conflicting > refs/heads/satellite/master. Right. All of our discussion has been on the case where the RHS doesn't match anything on the remote. > Probably what I need to do is better understand the "guess work" git-push > already does before trying to "improve" it. So, based on this thread and the > documentation, the following holds true: > > $ git push origin HEAD:newbranch > > is valid only if HEAD contains a branch ref pointer. Otherwise, if the LHS of > the refspec is not a known ref type, the RHS must always be explicit when > pushing a new ref. If the LHS is a known ref type, then the same ref type is > used for the RHS of the refspec - also the RHS becomes optional in such a case > and the LHS name will be used if the RHS was omitted. I think the RHS is always optional, isn't it? That is, if I say: git push origin foo then that is always equivalent to git push origin foo:foo which will then push to the matching "foo" on the remote; if it does not exist, then it will infer the type of "foo" on the remote from the type of "foo" locally. But I could be mis-remembering, as it's been a while since I've dug into the refspec code. Other than that, I think your description above is accurate. -Peff ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: error with $ git push origin HEAD:newbranch 2011-05-10 19:47 ` Jeff King @ 2011-05-11 10:10 ` chris 0 siblings, 0 replies; 11+ messages in thread From: chris @ 2011-05-11 10:10 UTC (permalink / raw) To: git Jeff King <peff <at> peff.net> writes: > > On Tue, May 10, 2011 at 03:34:26PM +0000, chris wrote: > > > > > $ git push origin HEAD:newbranch > > > > is valid only if HEAD contains a branch ref pointer. Otherwise, if the > > LHS of the refspec is not a known ref type, the RHS must always be > > explicit when pushing a new ref. If the LHS is a known ref type, then > > the same ref type is used for the RHS of the refspec - also the RHS > > becomes optional in such a case and the LHS name will be used if the RHS > > was omitted. > > I think the RHS is always optional, isn't it? That is, if I say: > > git push origin foo > > then that is always equivalent to > > git push origin foo:foo > > which will then push to the matching "foo" on the remote; if it does not > exist, then it will infer the type of "foo" on the remote from the type > of "foo" locally. But I could be mis-remembering, as it's been a while > since I've dug into the refspec code. Yes, but I was distinguishing when the LHS is not a known ref type $ git push origin HEAD^ isn't valid. So, my meaning was RHS only becomes optional if the LHS resolves to a local ref. Which may be obvious; I was just trying to cover the use cases. I think the generalization is that git-push tries to build the refspec using hints from the local ref part. If it can not do so, it fails rather than defaulting to any particular behavior. chris ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2011-05-11 17:26 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-05-05 8:47 error with $ git push origin HEAD:newbranch chris 2011-05-05 9:37 ` Jeff King 2011-05-05 10:06 ` chris 2011-05-05 10:59 ` Jeff King 2011-05-06 2:16 ` chris 2011-05-06 4:56 ` Junio C Hamano 2011-05-06 6:35 ` chris 2011-05-06 17:02 ` Jeff King 2011-05-10 15:34 ` chris 2011-05-10 19:47 ` Jeff King 2011-05-11 10:10 ` chris
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).