关于go get GHE repository 404问题的研究

说明: GHE指代GitHub Enterprise

这两天在工作环境中遇到一个奇怪的问题,使用go get github.com可以正确clone github 仓库代码,但是如果是公司内部私服(GHE),就会出现问题:


问题

在命令行中输入如下命令

go get -v -insecure github.com/your_private_repository

  • -v指打印详细信息

  • -insecure指先以https协议请求(默认), 如果请求结果不是200,再以http协议重新请求

你将会得到如下错误

Fetching https://github.com/your_private_repository?go-get=1
https fetch failed: Get https://github.com/your_private_repository?go-get=1: dial tcp 192.168.192.17:443: getsockopt: connection refused
Fetching http://github.com/your_private_repository?go-get=1
Parsing meta tags from http://github.com/your_private_repository?go-get=1 (status code 404)
package github.com/your_private_repository: unrecognized import path "github.com/your_private_repository" (parse http://github.com/your_private_repository?go-get=1: no go-import meta tags ())

但是如果这样输入,则可以下载下来

go get -v -insecure github.com/your_private_repository.git (注意这后面多了.git后缀)

但是很不幸这样下载下来的目录结构也带入了.git字样,于是工程里面所有指向自己工程包的引用都出现问题.

所以问题就是私有库url不带.git后缀就访问不了, 带了.git后缀,下载下来的路径就错了。


为什么GitHub public仓库就可以不用带.git访问呢?

原来go get 命令和 git clone命令不是等价的,通常我们执行一个go get 命令下载一个github.com的public 仓库,过程如下:

如果go get 的url中带了.git后缀的话,schema就会变成git协议,此时的url默认会变成下面这个样子

go get git://github.com/your_public_repository.git

而git协议的url golang当然知道用git命令下载,所以带.git后缀的url可以被成功下载, 如果不带.git的话,go get 就默认使用https,结果就变成了下面这样

go get https://github.com/your_public_repository

这条命令其实又会分为如下几步:

  1. 首先请求该地址的头部信息,结果类似

curl -I https://github.com/your_public_repository

  1. 从header返回信息里查找 go-import metadata
<meta name="go-import" content="github.com/your_repository git https://github.com/our_repository.git">
  1. 根据meta信息决定使用什么工具,如git,svn等

所以url可以不带.git的关键是url返回的header里必须包含meta信息,或者是知名的域名也可以不带,比如github.com, 事实上github带上.git反而会报错,非知名域名才会按照meta tag策略来执行


GHE为什么不带.git就访问不了?

很简单,直接用浏览器打开一个GHE的地址,没有登录的情况下,返回了404页面。而404页面的header里并没有包含任何go-import meta-tag

我从下面这个golang的bug report里找到了问题的答案,链接地址

https://github.com/golang/go/issues/17898

原来一直有个golang的bug没有解决这个问题,就在于golang和GitHub相互推脱,golang说自己已经提供了meta-tag的方式,让github在404页面也加入meta-tag,但github说自己为了保护私有库信息不被泄露,必须404不给任何信息,这样可以防止有人恶意猜测私有库信息(说的其实有道理)。两边就互不相让。后来一个哥们发现github上几乎所有页面都包含了一个header("Server: GitHub.com"),亲测确实在404页面也包含。所以这哥们就给golang打了个补丁,把这个问题就解决了,可是golang这个斯却迟迟不把这个补丁加进来,从1.8等到了1.9,到现在也没加入进来,最后看这个bug的回复是:


Moving to Go 1.11. I hope we'll have a more comprehensive story around company repos then.

@rsc rsc modified the milestones: Go1.10, Go1.11 19 days ago

坑爹啊!!!


解决方案

  1. 自己加入上面这哥们说的补丁, 地址
    https://go-review.googlesource.com/c/go/+/33171
  2. 搭建一个agent server,对于GHE的404 page,在response里加入meta tag
  3. 使用Git clone 代替go get,自己手动创建目录结果,手动维护
  4. 在项目代码里包引用路径里加入.git(官方推荐),当然go get 命令里也要加上.git
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269