Який правильний спосіб "дістати" приватне сховище?


143

Я шукаю спосіб отримати $ 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не так добре, чи є інше?


2
як тільки ви дотримуєтесь наведеної нижче відповіді, переконайтесь, що також експортуйте GOPRIVATE. наприкладexport GOPRIVATE="github.com/steelx/that-private-repo"
СТАЛЬ

Відповіді:


91

У вас є одна річ, щоб налаштувати. Приклад заснований на 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

Вже це було зроблено, насправді це лише один конфігуратор, catкоманда - лише для перевірки.
маска

1
Єдиним недоліком цього є те, що ви не можете мати різні конфігурації для кожного хоста (наприклад, якщо ви використовуєте кілька провайдерів), не змінюючи глобальну конфігурацію git кожного разу. Тоді набагато краще вказати це на рівні «ssh-level», як описано в ній: stackoverflow.com/questions/27500861/…
Йоахім

1
Я б хотів, щоб це було проголосовано вище. Навіть для публічних репост я вважаю за краще використовувати ssh там, де це можливо, оскільки два чинники роблять пароль незручним. Це виправляє всі репозиції github до ssh URL-адрес. Дякую!
captncraig

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

5
@secmask go getрозроблений як інструмент для загальної справи. Команда Go прямо вирішила не додавати налаштованості, щоб люди дотримувались стандартів замість того, щоб розгорнути власний супровід. Він ніколи не був зроблений для вашої справи (тобто приватних сховищ).
fuz

@Shudipta Будь ласка, припиніть редагування. Питання виглядає гірше, як ви цього хочете.
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

3
Цікаве використання http.extraheader. +1
VonC

29
буде --globalтакож відправити особистий маркер іншого сервера мерзотника в разі , якщо ви використовуєте багато репо? будь-який безпечний ризик?
секційна маска

Будь-який огляд на це? Я думаю, що він надішле це публічному
рефінансу Github,

13

Все вищезазначене для мене не вийшло. Клонування репо працювало правильно, але я все ще отримував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

10

Якщо у вас вже є мерзотник з допомогою 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/"

10

Це виглядає як випуск GitLab 5769 .

У 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 ".


Насправді вони (та інші) вже підтримують метатеги, але вони просто працюють для публічного репо (де go getможна побачити метатеги без входу)
секційна маска

@secmask, тому ви використовуєте ssh: для надання таким чином облікових даних.
VonC

ой, що просто варіант, я можу використовувати http, https до, але go getбуде виглядати команда go get gitlab.com/secmask/awserver-go.git.git(попрошу http основну автентифікацію), які теж не добре
маска

8

Створіть тут маркер github oauth та експортуйте маркер github як змінну середовища:

export GITHUB_TOKEN=123

Встановіть git config для використання базового URL-адреси auth:

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

Тепер ви можете отримати go getприватне репо.


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, а потім 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часу
Крістіан Чапаро А.

3

Я натрапив .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

Якщо ви хочете дотримуватися автентичності SSH, маскуйте запит на використання ssh насильно

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

Більше методів налаштування доступу до git: https://gist.github.com/technoweenie/1072829#gistcomment-2979908

Дивіться довідкову сторінку та цю відповідь щодо її використання разом із Git для Windows


2

Для мене рішення, запропоновані іншими, все ж таки давали таку помилку під час go get

git@gl.nimi24.com: У дозволі відмовлено (publickey). fatal: Не вдалося прочитати з віддаленого сховища. Переконайтеся, що у вас є правильні права доступу та сховище існує.

Для чого потрібне це рішення

  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 потрапить до вашого ключа без цього підказка, і вона працює

Це може бути викликано одночасним переходом модулів добору даних і одночасним відкриттям декількох підключень SSH до Github (як описано в цій статті ). Це дещо підтверджується тим, що журнал налагодження OpenSSH показав початкове підключення до успішного сховища, але пізніше чомусь спробував його знову, і цього разу вирішив попросити пароль.

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

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

Але як зазначалося, для мене це не спрацювало, можливо, я зробив це неправильно

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.