cmd/go: `go1` branch breaks `go get -u` when default branch is still `master`
stanford-scs opened this issue · comments
Please answer these questions before submitting your issue. Thanks!
What version of Go are you using (go version
)?
go version go1.10.3 linux/amd64
Does this issue reproduce with the latest release?
Probably. 1.10.3 is very recent.
What operating system and processor architecture are you using (go env
)?
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/user/.cache/go-build"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/user/go"
GORACE=""
GOROOT="/usr/lib/go"
GOTMPDIR=""
GOTOOLDIR="/usr/lib/go/pkg/tool/linux_amd64"
GCCGO="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build171873923=/tmp/go-build -gno-record-gcc-switches"
What did you do?
-
Create a remote repository for a simple program in which the
go1
branch is one commit ahead of master, butHEAD
still points tomaster
. -
Install the program with
go get -u github.com/whatever
. This works. -
Now without changing the repository, try
go get -u github.com/whatever
again, and it will fail.
What did you expect to see?
Within the gopath, go has cloned the repository and created a local branch tracking origin/go1
. go get -u
pulls from go1
(with nothing to pull since no changes) and successfully rebuilds the program.
What did you see instead?
$ go get -u github.com/whatever
# cd /home/user/go/src/github.com/whatever; git pull --ff-only
You are not currently on a branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull <remote> <branch>
package github.com/whatever: exit status 1
And if I cd to /home/user/go/src/github.com/whatever
, I'm in a detached head state:
$ git symbolic-ref HEAD
fatal: ref HEAD is not a symbolic ref
Could you try and see the behavior with 1.11 ?
I can confirm that the problem also happens with go 1.11. For an easy repro, try installing my goxdr
tool twice:
go get -u github.com/xdrpp/stc/goxdr
go get -u github.com/xdrpp/stc/goxdr
From go help get
:
When checking out or updating a package, get looks for a branch or tag
that matches the locally installed version of Go. The most important
rule is that if the local installation is running version "go1", get
searches for a branch or tag named "go1". If no such version exists
it retrieves the default branch of the package.
Yes, it's weird, but it's always been that way, and we're not going to change that behavior today. Instead, we're going to delete this whole thing once modules are ready (in a couple releases). For now, sorry, but don't name a branch go1 if you don't want go get
to use it (even for -u
).
@rsc I think maybe you misunderstood the bug report. I want go get
to use the branch, but instead it's using a detatched head. Sounds like you don't care, though, but I thought I'd at least set the record straight that the actual behavior is not what you think it is or what the docs describe.