Как правильно «получить» частный репозиторий?

157

Я ищу способ получить $ go getработу с частным репозиторием после многих попыток Google.

Первая попытка:

$ go get -v gitlab.com/secmask/awserver-go
Fetching https://gitlab.com/secmask/awserver-go?go-get=1
https fetch failed.
Fetching http://gitlab.com/secmask/awserver-go?go-get=1
Parsing meta tags from http://gitlab.com/secmask/awserver-go?go-get=1 (status code 200)
import "gitlab.com/secmask/awserver-go": parse http://gitlab.com/secmask/awserver-go?go-get=1: no go-import meta tags
package gitlab.com/secmask/awserver-go: unrecognized import path "gitlab.com/secmask/awserver-go

Да, он не видел метатеги, потому что я не знал, как предоставить информацию для входа.

Вторая попытка:

Следуйте https://gist.github.com/shurcooL/6927554 . Добавьте конфиг в .gitconfig.

[url "ssh://git@gitlab.com/"]
    insteadOf = https://gitlab.com/
$ go get -v gitlab.com/secmask/awserver-go --> not work
$ go get -v gitlab.com/secmask/awserver-go.git --> work but I got src/gitlab.com/secmask/awserer-go.git

Да, это работает, но с .gitрасширением с именем моего проекта я могу переименовать его в оригинальное, но делать это каждый раз $ go getне так хорошо, есть ли другой способ?

secmask
источник

Ответы:

102

Вам нужно настроить одну вещь. Пример основан на GitHub, но это не должно изменить процесс:

$ git config --global url.git@github.com:.insteadOf https://github.com/
$ cat ~/.gitconfig
[url "git@github.com:"]
    insteadOf = https://github.com/
$ go get github.com/private/repo

Чтобы модули Go работали (с Go 1.11 или новее), вам также необходимо установить GOPRIVATEпеременную, чтобы не использовать общедоступные серверы для получения кода:

export GOPRIVATE=github.com/private/repo
JulienD
источник
Уже сделал это, на самом деле это только одна конфигурация, catкоманда предназначена только для проверки.
secmask
1
Единственный недостаток этого заключается в том, что вы не можете иметь разные конфигурации для каждого хоста (например, если вы используете несколько провайдеров) без изменения глобальной конфигурации git каждый раз. Тогда гораздо лучше указать это на «ssh-level», как она описала: stackoverflow.com/questions/27500861/…
Иоахим
go env -w GOPRIVATE=github.com/<OrgNameHere>/*как описано здесь stackoverflow.com/questions/58305567/…
huggie
53

Правильный способ - вручную поместить репозиторий в нужное место. Как только репозиторий появится, вы можете использовать его go get -uдля обновления пакета и go installего установки. Пакет с именем

github.com/secmask/awserver-go

переходит в

$GOPATH/src/github.com/secmask/awserver-go

Вы вводите следующие команды:

cd $GOPATH/src/github.com/secmask
git clone git@github.com:secmask/awserver-go.git
фуз
источник
6
@secmask go getразработан как инструмент для общего случая. Команда Go прямо решила не добавлять возможности настройки, чтобы люди придерживались стандартов, вместо того, чтобы выкладывать свой собственный мусор. Он никогда не создавался для вашего случая (например, частных репозиториев).
fuz
34

У меня возникла проблема с go getиспользованием частного репозитория на gitlab от нашей компании. Я потерял несколько минут, пытаясь найти решение. И я нашел вот это:

  1. Вам необходимо получить приватный токен по адресу:
    https://gitlab.mycompany.com/profile/account.

  2. Настройте git, чтобы добавить дополнительный заголовок с вашим личным токеном:

    $ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
    
  3. Настройте свой git для преобразования запросов из http в ssh :

    $ git config --global url."git@gitlab.mycompany.com:".insteadOf "https://gitlab.mycompany.com/"
    
  4. Наконец, вы можете использовать свой go getобычный:

    $ go get gitlab.com/company/private_repo
    
Родриго Оливейра
источник
4
Интересное использование http.extraheader. +1
VonC
33
будет --globalтакже отправить личный маркер другого серверу мерзавца в случае , если вы используете много репо? любой безопасный риск?
secmask
Есть ли у кого-нибудь обзор по этому поводу? Я думаю, он отправит его в публичный репозиторий github, когда мы займемся им,
Хему,
Есть еще один вариант, когда вы отправляете токен только на свой gitlab, но я не уверен, что он закодирован. git config --global url."https://${user}:${personal_access_token}@mygitlab.com".insteadOf "https://mygitlab.com"
SR
14

Все вышеперечисленное у меня не сработало. Клонирование репо работало правильно, но я все еще получал unrecognized importошибку.

Поскольку это означает Go v1.13, я обнаружил в документе, что мы должны использовать переменную GOPRIVATE env следующим образом:

$ GOPRIVATE=github.com/ORGANISATION_OR_USER_NAME go get -u github.com/ORGANISATION_OR_USER_NAME/REPO_NAME
Jolancornevin
источник
10

Это похоже на проблема 5769 GitLab .

В GitLab, поскольку репозитории всегда заканчиваются на .git , я должен указать .gitв конце имени репозитория, чтобы он работал, например:

import "example.org/myuser/mygorepo.git"

А также:

$ go get example.org/myuser/mygorepo.git

Похоже, GitHub решает эту проблему, добавляя ".git" .

Предполагается, что это будет решено в разделе « Добавлена ​​поддержка извлечения репозитория Go. # 5958 », при условии, что установлены правильные метатеги .
Хотя для самого Go все еще существует проблема: « cmd/go: go get не может обнаружить метатег в документах HTML5 ».

VonC
источник
На самом деле они (и другие) уже поддерживают метатеги, но это просто работает для публичного репо (где go getможно видеть метатеги без входа в систему)
secmask
@secmask, поэтому вы используете ssh: для предоставления учетных данных таким образом.
VonC
о, это просто вариант, я могу использовать http, https, но go getкоманда будет выглядеть go get gitlab.com/secmask/awserver-go.git.git(запросит базовую аутентификацию http), что тоже выглядит не очень хорошо.
secmask
9

Разработай GitHub OAuth маркер здесь и экспортировать ваш GitHub фишку как переменная окружения:

export GITHUB_TOKEN=123

Настройте git config на использование базового URL-адреса авторизации:

git config --global url."https://$GITHUB_TOKEN:x-oauth-basic@github.com/".insteadOf "https://github.com/"

Теперь вы можете сделать go getчастное репо.

Мигель Мота
источник
9

Если у вас уже есть мерзавец с помощью SSH, этот ответ на Аммар Bandukwala простой обходной путь:


$ go getиспользует gitвнутренне. Следующие лайнеры сделают gitи, следовательно,$ go get клонировать ваш пакет через SSH.

Github:

$ git config --global url."git@github.com:".insteadOf "https://github.com/"

BitBucket:

$ git config --global url."git@bitbucket.org:".insteadOf "https://bitbucket.org/"
Роберт К. Белл
источник
5

Я создал ssh-config для конкретного пользователя, поэтому мой пользователь автоматически входит в систему с правильными учетными данными и ключом.

Сначала мне нужно было сгенерировать пару ключей

ssh-keygen -t rsa -b 4096 -C "my@email.here"

и сохранил его, например ~/.ssh/id_my_domain. Обратите внимание, что это также пара ключей (закрытая и общедоступная), которую я подключил к своей учетной записи Github, поэтому мой хранится в~/.ssh/id_github_com .

Затем я создал (или изменил) файл ~/.ssh/configс записью:

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_github_com

На другом сервере "ssh-url" имеет вид, admin@domain.com:username/private-repo.gitи запись для этого сервера будет:

Host domain.com
    HostName domain.com
    User admin
    IdentityFile ~/.ssh/id_domain_com

Просто чтобы прояснить , что вам нужно убедиться , что User, HostиHostName установлены правильно.

Теперь я могу просто перейти по пути перехода, а затем go get <package>, например, go get mainтуда , где файл main/main.goвключает пакет (из последнего примера выше) domain.com:username/private-repo.git.

Иоахим
источник
Вы также можете напрямую импортировать пакет с помощью: go get hostname.com/username/repo.git(расширение .git имеет решающее значение).
Иоахим
есть ли способ сделать это без расширения .gitи почему это происходит?
Кристиан Чапарро А.
1
Интересно, что причина, по которой я не могу получить репо, без .gitрасширения это то, что в моей локальной конфигурации git git config --global url."git@gitlab.myserver.com:".insteadOf "https://gitlab.myserver.com/", но субдомен gitlab.myserver.comне имеет сертификата ssl, поэтому я использую httpвместо этого httpsсейчас
Кристиан Chaparro A.
5

Я наткнулся .netrc и нашел это относящимся к этому.

Создайте файл ~/.netrcсо следующим содержанием:

machine github.com
    login <github username>
    password <github password or Personal access tokens >

Выполнено!

Кроме того, для последних версий GO вам может потребоваться добавить это в переменные среды GOPRIVATE=github.com (я добавил это в свои .zshrc)

netrc также улучшает настройку моей среды разработки, так как мой личный доступ к github для HTTPS теперь настроен для использования на всей машине (как и моя конфигурация SSH).

Создайте токены личного доступа GitHub: https://github.com/settings/tokens

Смотрите этот ответ для его использования с Git в Windows, в частности

Ссылка: справочная страница netrc


Если вы хотите придерживаться аутентификации SSH, то замаскируйте запрос на принудительное использование ssh.

git config --global url."git@github.com:".insteadOf "https://github.com/"


Дополнительные методы настройки доступа к git: https://gist.github.com/technoweenie/1072829#gistcomment-2979908

Канак Сингхал
источник
Это требует, чтобы вы сохранили свои учетные данные для входа в обычный текстовый файл на вашем компьютере. Это не хорошо.
Иоахим
Вы, наверное, правы. Для меня это похоже на то, как учетные данные AWS хранятся в ~/.aws. А с токеном личного доступа GitHub я могу детализировать доступ в соответствии с требованиями и ротацией элементов управления. Также есть способ SSH 👆
Канак Сингхал
3

Для меня решения, предлагаемые другими, по-прежнему давали следующую ошибку во время go get

git@gl.nimi24.com: В доступе отказано (публичный ключ). фатальный: не удалось прочитать из удаленного репозитория. Убедитесь, что у вас есть правильные права доступа и репозиторий существует.

Что требовалось для этого решения

  1. Как заявили другие:

    git config --global url."git@github.com:".insteadOf "https://github.com/"

  2. Удаление парольной фразы из моего ./ssh/id_rsaключа, который использовался для аутентификации соединения с репозиторием. Это можно сделать, введя пустой пароль в ответ на запрос:

    ssh-keygen -p

Почему это работает

Это не лучший обходной путь, так как всегда лучше иметь парольную фразу для вашего закрытого ключа, но это вызывало проблемы где-то внутри OpenSSH.

go getиспользует внутренне git, который использует openssh для открытия соединения. OpenSSH берет сертификаты, необходимые для аутентификации, из .ssh/id_rsa. При выполнении команд git из командной строки агент может позаботиться об открытии файла id_rsa для вас, чтобы вам не приходилось каждый раз указывать кодовую фразу, но при выполнении в животе go get это почему-то не сработало в моем кейс. OpenSSH хочет запросить у вас пароль, но, поскольку это невозможно из-за того, как он был вызван, он печатает в своем журнале отладки:

read_passphrase: невозможно открыть / dev / tty: нет такого устройства или адреса

И просто не получается. Если вы удалите кодовую фразу из ключевого файла, OpenSSH перейдет к вашему ключу без этого запроса, и он будет работать.

Это может быть вызвано тем, что Go одновременно загружает модули и одновременно открывает несколько SSH-соединений с Github (как описано в этой статье. ). В некоторой степени это подтверждается тем фактом, что журнал отладки OpenSSH показал, что первоначальное соединение с репозиторием было успешным, но позже по какой-то причине попытались снова, и на этот раз решили запросить парольную фразу.

Однако решение использовать мультиплексирование SSH-соединений, предложенное в упомянутой статье, у меня не сработало. Для записи автор предложил добавить следующую конфигурацию в файл конфигурации ssh для затронутого хоста:

  ControlMaster auto
  ControlPersist 3600
  ControlPath ~/.ssh/%r@%h:%p

Но как уже говорилось, для меня это не сработало, может я ошибся

Тармо
источник
1

После настройки GOPRIVATE иgit config ...

Люди могут по-прежнему сталкиваться с подобными проблемами при получении частного источника:

https fetch: Get "https://private/user/repo?go-get=1": EOF

Они не могут использовать частное репо без .gitрасширения.

Причиной этого является инструментом идти не имеет ни малейшего представления о протоколе VCS этого репо, gitили svnили любой другой, в отличие от github.comили golang.orgих жестко закодированы в источник Гоу.

Затем инструмент go выполнит httpsзапрос перед получением вашего частного репо:

https://private/user/repo?go-get=1

Если ваше частное репо не поддерживает httpsзапросы, используйте, replaceчтобы сообщить об этом напрямую:

require private/user/repo v1.0.0

...

replace private/user/repo => private.server/user/repo.git v1.0.0

https://golang.org/cmd/go/#hdr-Remote_import_paths

игонджек
источник