cmd/go: go mod tidy not using .git/config settings

j9per5c4  于 4个月前  发布在  Go
关注(0)|答案(9)|浏览(48)

Go版本

go版本 go1.21.5 darwin/arm64

在你的模块/工作区中的go env输出:

GO111MODULE=''
GOARCH='arm64'
GOBIN=''
GOCACHE='/Users/nyap/Library/Caches/go-build'
GOENV='/Users/nyap/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='arm64'
GOHOSTOS='darwin'
GOINSECURE=''
GOMODCACHE='/Users/nyap/go/pkg/mod'
GONOPROXY='gitlab.com/grailbio/teams/*'
GONOSUMDB='gitlab.com/grailbio/teams/*'
GOOS='darwin'
GOPATH='/Users/nyap/go'
GOPRIVATE='gitlab.com/grailbio/teams/*'
GOPROXY='https://artifactory.ti-apps.aws.grail.com/artifactory/api/go/go,https://proxy.golang.org'
GOROOT='/Users/nyap/.gimme/versions/go1.21.5.darwin.arm64'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/Users/nyap/.gimme/versions/go1.21.5.darwin.arm64/pkg/tool/darwin_arm64'
GOVCS=''
GOVERSION='go1.21.5'
GCCGO='gccgo'
AR='ar'
CC='clang'
CXX='clang++'
CGO_ENABLED='0'
GOMOD='/dev/null'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -arch arm64 -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/var/folders/w7/l4dcw2ss1l98wqcxsx1pq03h0000gs/T/go-build3824820425=/tmp/go-build -gno-record-gcc-switches -fno-common'

你做了什么?

在工作区的.git/config中:

[url "ssh://git@gitlab.com"]
	insteadOf = https://gitlab.com

然后是go mod tidy

你看到了什么发生?

go mod tidy发出了许多no secure protocol found for repository错误:

go: downloading gitlab.com/grailbio/teams/bxds/gsl/core.git v0.3.1
go: grail.com/cmd/bio-gsl imports
	gitlab.com/grailbio/teams/bxds/gsl/core.git/bio/comparator/count: no secure protocol found for repository
go: grail.com/cmd/bio-gsl imports
…

你期望看到什么?

没有错误。
url设置从.git/config移动到~/.gitconfig后,go mod tidy按预期工作。

hfyxw5xn

hfyxw5xn1#

事实是,本地的 .git/config 被忽略了,这是设计好的。git 仓库中包含 go 命令下载依赖项,但它与包含您自己模块的仓库不同。
然而,首先需要这个 insteadOf 指令是出乎意料的。gitlab.com 不是受 #26134 影响的提供者之一,因此 go 命令应该使用 git ls-remote 来探测仓库,以确定要使用哪种协议。那里可能有一个真正的错误,我们可以修复它,这样你就不需要一开始就使用 insteadOf 指令了。

w8ntj3qf

w8ntj3qf2#

为了认证原因,也许可以使用insteadOf?

dfddblmv

dfddblmv3#

查看 code ,我认为 go 命令是尝试使用类似于 git ls-remote ssh://gitlab.com/user/repo.git 的东西来ping仓库。
相比之下,默认情况下GitLab要求特定的用户 git ,这将是一个类似于 ssh://git@gitlab.com/user/repo.git 的URL。我们当然可以硬编码一个用户来尝试特定的常见主机(至少是GitHub和GitLab),但我想知道是否有更通用的方法来检测我们应该尝试哪个SSH用户。

t5fffqht

t5fffqht4#

这更像是一个权宜之计,但出于身份验证的原因,我在~/.gitconfig上使用了这个确切的配置:

[url "ssh://git@github.com/"]
       insteadOf = https://github.com/
[url "ssh://git@gitlab.com/"]
       insteadOf = https://gitlab.com/

它与GOPRIVATEGOPROXY=direct完美配合(go模块调用git cli,然后执行ssh)。

bwitn5fc

bwitn5fc5#

Jorropo,我好奇:如果你在.gitconfig中使用insteadOf = ssh://github.com/,它是否仍然有效?
(我的假设是它仍然有效,如果是这样,我认为go命令应该自己知道怎么做!)

fwzugrvs

fwzugrvs6#

@bcmills 它没有:

> GOPRIVATE=github.com go get github.com/ipfs/$REPO@latest
go: github.com/ipfs/$REPO@latest: module github.com/ipfs/$REPO: git ls-remote -q origin in /home/hugo/go/pkg/mod/cache/vcs/1572f4aa1ba63bc6815a9b2d64ca8e071b19e19f33e22b6a95cf4bf0efb40471: exit status 128:
fatal: could not read Username for 'https://github.com': terminal prompts disabled
Confirm the import path was entered correctly.
If this is a private repository, see https://golang.org/doc/faq#git_https for additional information.
> cat ~/.gitconfig
# ...
[url "ssh://git@github.com/"]
insteadOf = ssh://github.com/
# ...
> nano ~/.gitconfig # put it back to insteadOf = https://github.com/
> GOPRIVATE=github.com go get github.com/ipfs/$REPO@latest # works
go: downloading github.com/ipfs/$REPO v0.2.20
ffx8fchx

ffx8fchx7#

@Jorropo,谢谢,我想这是因为#26134。那么对于gitlab.com的URL呢?

uurity8g

uurity8g8#

你好!问题是实际存在的,我尝试用这种方式解决问题,但它没有帮助。
echo "machine $CI_SERVER_HOST login gitlab-ci-token password ${CI_JOB_TOKEN}" > ~/.netrc export GOPRIVATE=gitlab.com/* export GOPROXY=direct export GOSUMDB=off export PKG_CONFIG_PATH="/usr/lib/x86_64-linux-gnu/pkgconfig/" apt update && apt install -y libssl-dev openssl git gcc musl-dev pkg-config git config --global http.sslverify false
你能帮忙吗?
我认为最好的方法是为编译器创建一个新的环境,例如将GOSSL设置为off或将GOSECURE设置为off。

mf98qq94

mf98qq949#

lint-test-job: # This job also runs in the test stage.
stage: test # It can run at the same time as unit-test-job (in parallel).
script:
- echo "Linting code..."
- git config --global url."http://192.168.88.88:30080/".insteadof "https://gitlab.yyle.com/"
- git config --global url."http://192.168.88.88:31080/".insteadof "http://gitlab.yyle.com/"
- git config --global --list
- go env -w GOPRIVATE=gitlab.yyle.com
- go env -w GOPROXY=https://proxy.golang.org,direct
- go mod tidy


未找到仓库的安全协议

相关问题