go-git: Как пройти аутентификацию на удаленном сервере?
Я использую Go-проект go-git в качестве git-клиента и хочу получить из частного git-репозитория, размещенного через gitea.
Соответствующая функция для этого func (r *Remote) Fetch(o *FetchOptions) error
, который ожидает transport.AuthMethod
объект для аутентификации.
Я попробовал следующее:
repo, _ := git.PlainOpen("/path/to/project/folder")
err := repo.Fetch(&git.FetchOptions{
Auth: http.NewBasicAuth("someUser", "andThePassword"),
})
... который просто возвращает:
неверный метод аутентификации
То же самое происходит, если я использую
authenticator, _ := ssh.NewSSHAgentAuth("git")
из пакета "gopkg.in/src-d/go-git.v4/plumbing/transport/ssh"
,
А также, если я использую сертификат:
authenticator, _:= ssh.NewPublicKeysFromFile("gitea name", "/home/name/.ssh/id_rsa", "passphrase")
Как узнать, какой метод аутентификации поддерживается, и существуют ли существующие реализации transport.AuthMethod
что я мог бы использовать?
2 ответа
Проблема была в том, что я использовал неправильный http-пакет для получения аутентификатора.
Я использовал BasicAuth()
из пакета net/http
- однако правильный http-пакет для использования gopkg.in/src-d/go-git.v4/plumbing/transport/http
,
При изменении импорта и использовании (совместимого) BasicAuth-аутентификатора он работает безупречно.
Это сработало для меня с gopkg.in/src-d/go-git.v4
func cloneGit() (err error) {
username := "dude"
password := "super-secret-Personal-access-token"
repo := "github.build.company.com/org/repo-name.git"
url := fmt.Sprintf("https://%s:%s@%s", username, password, repo)
options := git.CloneOptions{
URL: url,
Progress: os.Stdout,
}
r, err := git.PlainClone("./src", false, &options)
if err != nil {
return err
}
fmt.Println(r.Log)
return err
}