Golang中如何搭建Git服务器用于代码获取

Golang中如何搭建Git服务器用于代码获取 我在我的 Git 服务器的仓库页面上添加了一个 go-import 元标签,它看起来像这样:

但是,当我尝试运行 go get brijesh.dev/kairos 时,出现了一个错误提示:go: unrecognized import path "brijesh.dev/kairos": reading https://brijesh.dev/kairos?go-get=1: 404 Not Found

这很可能是因为它正在访问 brijesh.dev/kairos?go-get=1(这是无效的),而不是 brijesh.dev/kairos.git?go-get=1(正确的地址),尽管在 go-import 标签中 URL 是带有 .git 的。


更多关于Golang中如何搭建Git服务器用于代码获取的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

您需要确保能够访问您的代码仓库,出现404错误意味着您的URL有误或者服务器上没有您的内容。

更多关于Golang中如何搭建Git服务器用于代码获取的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


URL不应包含.git。它应包含你想在import语句中使用的路径,前面加上https://,末尾加上"?go-get=1"。以下是一个示例:

curl https://gopkg.in/yaml.v2?go-get=1

这不是一个git服务器。我称之为go-get服务器。我在这里写了一个:GitHub - melato/goget

在Go模块系统中,go get命令通过HTTP请求查找go-import元标签来解析导入路径。根据你的描述,问题可能出现在服务器配置或元标签格式上。以下是解决方案:

1. 确保正确的go-import元标签格式

在你的brijesh.dev/kairos页面中,需要包含正确的HTML元标签:

<!DOCTYPE html>
<html>
<head>
    <meta name="go-import" content="brijesh.dev/kairos git https://brijesh.dev/kairos.git">
    <meta name="go-source" content="brijesh.dev/kairos _ https://brijesh.dev/kairos/tree/master{/dir} https://brijesh.dev/kairos/blob/master{/dir}/{file}#L{line}">
</head>
<body>
    go get brijesh.dev/kairos
</body>
</html>

2. 服务器配置示例

如果你使用Nginx,确保正确配置:

server {
    listen 80;
    server_name brijesh.dev;
    
    location /kairos {
        # 返回包含go-import元标签的HTML
        if ($arg_go-get = '1') {
            add_header Content-Type text/html;
            return 200 '<!DOCTYPE html><html><head><meta name="go-import" content="brijesh.dev/kairos git https://brijesh.dev/kairos.git"></head><body>go get brijesh.dev/kairos</body></html>';
        }
        
        # 其他请求重定向到Git仓库
        rewrite ^/kairos$ /kairos.git permanent;
    }
    
    location /kairos.git {
        # Git HTTP后端配置
        # 这里配置你的Git HTTP服务
    }
}

3. 使用Go编写的简单Git服务器示例

这是一个处理go-import元标签的简单HTTP服务器:

package main

import (
    "fmt"
    "net/http"
    "strings"
)

func main() {
    http.HandleFunc("/kairos", func(w http.ResponseWriter, r *http.Request) {
        if r.URL.Query().Get("go-get") == "1" {
            w.Header().Set("Content-Type", "text/html")
            fmt.Fprintf(w, `<!DOCTYPE html>
<html>
<head>
    <meta name="go-import" content="brijesh.dev/kairos git https://brijesh.dev/kairos.git">
</head>
<body>
    go get brijesh.dev/kairos
</body>
</html>`)
            return
        }
        http.Redirect(w, r, "https://brijesh.dev/kairos.git", http.StatusFound)
    })

    http.ListenAndServe(":8080", nil)
}

4. 验证步骤

创建测试文件验证配置:

// test_import.go
package main

import (
    "fmt"
    "io"
    "net/http"
    "strings"
)

func checkGoImport() {
    resp, err := http.Get("https://brijesh.dev/kairos?go-get=1")
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    
    body, _ := io.ReadAll(resp.Body)
    fmt.Println("Response:", string(body))
}

5. 完整的Git服务器配置示例

使用git-http-backend的完整配置:

# 启用Git HTTP传输
cd /var/www/git
git clone --bare /path/to/kairos kairos.git

# 配置钩子(如果需要)
cd kairos.git/hooks
cat > post-update << 'EOF'
#!/bin/sh
exec git update-server-info
EOF
chmod +x post-update

确保当访问https://brijesh.dev/kairos?go-get=1时,服务器返回包含正确go-import元标签的HTML响应。Go工具链会解析这个元标签中的URL来克隆仓库。

回到顶部