5

go-gitGitHub Enterprise からリポジトリをクローンするために使用しようとしています。そのために、レポに対する適切なアクセス許可を持つアクセス トークンを使用して HTTPS プロトコルを使用しています (コマンド ラインで確認済み)。サーバーが 400 で応答するためgo-git、RPC 呼び出しを行うときに失敗します。git-upload-pack

$ go run main.go
unexpected client error: unexpected requesting "https://github.mycompany.net/my-org/myrepo.git/info/refs?service=git-upload-pack" status code: 400

それが行う要求はこれと同等です:

GET /my-org/myrepo.git/info/refs?service=git-upload-pack HTTP/1.1
Host: github.mycompany.net
User-Agent: git/1.0
Accept: */*
Authorization: Bearer atokenthatisdefinitelyvalid

要求ヘッダーにトークンがないとAnonymous access denied、リポジトリから予期される 401 () 応答が返されます。トークンを使用すると、400 で応答します。

Enterprise 以外の GitHub のパブリック リポジトリについても同じことが言えます。Authorizationただし、ヘッダーは必要ないため、(予想どおり) ヘッダーなしで機能するという違いがあります。有効なトークンを含めると、エンタープライズ バージョンと同様に GitHub は 400 で応答します。

以下は最小限の例です。go-git認証が必要な GitHub Enterprise で使用する方法はありますか? 理想的には認証トークンを使用しますか?

package main

import (
    "fmt"
    "io/ioutil"

    git "gopkg.in/src-d/go-git.v4"
    "gopkg.in/src-d/go-git.v4/plumbing"
    "gopkg.in/src-d/go-git.v4/plumbing/transport/http"
)

const (
    repoURL           = "https://github.mycompany.net/my-org/myrepo.git"
    githubAccessToken = "atokenthatisdefinitelyvalid"
)

func main() {
    dir, _ := ioutil.TempDir("", "temp_dir")

    options := &git.CloneOptions{
        Auth:          &http.TokenAuth{Token: githubAccessToken},
        URL:           repoURL,
        Depth:         500,
        ReferenceName: plumbing.ReferenceName("refs/heads/master"),
        SingleBranch:  true,
        Tags:          git.NoTags,
    }

    _, err := git.PlainClone(dir, false, options)
    fmt.Println(err)
}
4

2 に答える 2