【问题标题】:Using "go get" on a personal git repo [duplicate]在个人 git repo 上使用“go get”[重复]
【发布时间】:2014-12-08 11:05:39
【问题描述】:

我将我的 git 存储库托管在个人 VPS 上,并且我有一个想要“去获取”的包。我试图根据通过发出“go help importpath”找到的帮助文档来设置所有内容,但没有成功。无论我做什么,我都会收到以下错误:

package example.com/user/package: unrecognized import path "example.com/user/package"

我已经尝试了上述 META 标记的所有组合,结果相同。

<meta name="go-import" content="example.com git http://example.com/user/package">

可以通过http://example.com/user/package.git 访问实际的 git 存储库。我可以直接克隆它,但我想去下载并正确安装它。

根据帮助文档,如果 go 向http://example.com/user/package?go-get=1 发出请求,则返回的页面包含 META 标记。如果 go 然后向http://example.com/?go-get=1 发出后续请求,则返回的页面也包含完全相同的 META 标记。

是否需要在服务器上进行任何特殊配置?我不这么认为,因为 go 将通过 http 请求访问存储库。

我已经束手无策了。您能提供的任何帮助将不胜感激。

【问题讨论】:

  • 这不应该因为重复而被关闭。另一个问题是关于大型服务器上的私人回购。这个问题是关于个人服务器上的公共回购。真的是相反的问题。

标签: git go


【解决方案1】:

这是我配置 nginx 为 gitlab 服务器返回的元标记: 如果你要求http://mygit.server/group/project?go-get=1

你得到:

<meta content='mygit.server/group/project git git+ssh://git@mygit.server/group/project.git' name='go-import'>

它就像一个魅力。

这是执行此操作的 nginx 重写规则:

location ~ "(/[^/]+/[^/]+)(/.*)?" {
    if ($arg_go-get = "1") {
            echo '<html><head><meta name="go-import" content="my.domain.com$1 git git+ssh://git@my.domain.com$1"/></head></html>';
    }
    try_files $uri $uri/index.html $uri.html @gitlab;
  }

这当然假设您正在使用 git over ssh。如果您使用 https,请相应地重写 url。

【讨论】:

    【解决方案2】:

    我刚刚为自己做了这个——类似的场景:一些小型的 go repos 和一个主要是私有的网站。 Nginx 配置:

    root /var/www;
    
    location / {
        try_files $uri?$args $uri $uri/ @my-proxy;
    }
    

    然后我运行:

    $ echo '<html><head><meta name="go-import" content="example.com/project-name git git+ssh://example.com/~/code/magic/blah/project-name.git" /></head></html>' > /var/www/project-name\?go-get\=1
    
    • 查询字符串嵌入到文件名中,如果存在,nginx 会提供该文件名。
    • 我们为每个项目创建一个适当(有点奇怪)名称的文件。
    • 每个文件都包含一个带有适当 &lt;meta /&gt; 标签的最小 HTML 文档

    成本是每次点击位置块时额外调用一次 stat(),但您避免了可怕的 nginx if 指令和 out-of-tree echo 模块,并且可以微调每个元内容 -存储库。

    如果那些奇怪的文件名困扰你,你可以限制范围:import "example.com/code/project-name" 在你的 .go 文件中,location /code { try_files ... } 在 nginx 中。

    【讨论】:

    • 我正在这样做,然后遇到了重定向循环的问题,然后我意识到只需将元标记放在 repo 的网页上就足够了!只要不妨碍获得 cgi 风格,就可以得到 req args。不过像静态网页就好了。
    • 换句话说,一个静态的普通非 CGI 网页,如果它有那个元标记,那么它仍然可以工作,如果它有那个元标记。无需嵌入查询字符串,只要 $uri 部分自己提供具有该元数据的文件即可。 Iow 只需将该元标记粘贴到您的 repo 的网页中。
    【解决方案3】:

    只是为了扩展@Not_a_Golfer 的答案,这非常有帮助。

    我在 Gerrit 安装中使用 Gitiles 浏览源代码,所以现在 godoc 可以工作了(它将文档链接到正确的代码行):

        # http://stackoverflow.com/questions/26347516/using-go-get-on-a-personal-git-repo/26348986#26348986
        location ~ "(/[^/]+)(/.*)?" {
            if ($arg_go-get = "1") {
                    echo '<html><head><meta name="go-import" content="myserver.example.com$1 git https://myserver.example.com$1"/><meta name="go-source" content="myserver.example.com$1 https://myserver.example.com/plugins/gitiles$1 https://myserver.example.com/plugins/gitiles$1/+/master/{dir} https://myserver.example.com/plugins/gitiles$1/+/master/{dir}/{file}#{line}" /></head></html>';
            }
            try_files $uri @gerrit;
        }
    
        location / {
            try_files $uri @gerrit;
        }
    

    【讨论】:

      猜你喜欢
      • 2019-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 2017-07-13
      • 2011-06-07
      • 2011-07-12
      • 1970-01-01
      相关资源
      最近更新 更多