Was ist der richtige Weg, um ein privates Repository zu bekommen?

143

Ich suche nach dem Weg, um $ go getArbeit mit privatem Repository zu bekommen , nach vielen Google-Versuchen.

Der erste Versuch:

$ 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

Ja, die Meta-Tags wurden nicht angezeigt, da ich nicht wissen konnte, wie Anmeldeinformationen bereitgestellt werden sollen.

Der zweite Versuch:

Folgen Sie https://gist.github.com/shurcooL/6927554 . Fügen Sie config zu .gitconfig hinzu.

[url "ssh://[email protected]/"]
    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

Ja, es funktioniert, aber mit der .gitErweiterung mit meinem Projektnamen kann ich es in Original umbenennen, aber jedes Mal, wenn es $ go getnicht so gut ist, gibt es eine andere Möglichkeit?

secmask
quelle
2
Wenn Sie der folgenden Antwort folgen, müssen Sie auch exportieren GOPRIVATE. zBexport GOPRIVATE="github.com/steelx/that-private-repo"
STAHL

Antworten:

91

Sie müssen eine Sache konfigurieren. Das Beispiel basiert auf GitHub, dies sollte jedoch den Prozess nicht ändern:

$ git config --global url.git@github.com:.insteadOf https://github.com/
$ cat ~/.gitconfig
[url "[email protected]:"]
    insteadOf = https://github.com/
$ go get github.com/private/repo
JulienD
quelle
Bereits getan, eigentlich ist es nur eine Konfiguration zu tun, catBefehl ist nur zur Überprüfung.
Sekmask
1
Der einzige Nachteil dabei ist, dass Sie nicht für jeden Host eine andere Konfiguration haben können (z. B. wenn Sie mehrere Anbieter verwenden), ohne die globale Git-Konfiguration für jedes Mal zu ändern. Dann ist es viel besser, dies auf «ssh-Ebene» anzugeben, wie sie beschrieben hat: stackoverflow.com/questions/27500861/…
Joachim
1
Ich wünschte, dies wäre höher gewählt worden. Selbst für öffentliche Repos bevorzuge ich die Verwendung von ssh, wo immer dies möglich ist, da zwei Faktoren die Authentifizierung von Passwörtern schwierig machen. Dies behebt alle Github-Repos auf SSH-URLs. Vielen Dank!
Captncraig
53

Der richtige Weg ist, das Repository manuell an der richtigen Stelle zu platzieren. Sobald das Repository vorhanden ist, können Sie go get -udas Paket aktualisieren und go installinstallieren. Ein Paket mit dem Namen

github.com/secmask/awserver-go

gehört in

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

Die Befehle, die Sie eingeben, sind:

cd $GOPATH/src/github.com/secmask
git clone git@github.com:secmask/awserver-go.git
fuz
quelle
5
@secmask go getwurde als Tool für den allgemeinen Fall entwickelt. Das Go-Team hat sich ausdrücklich gegen das Hinzufügen von Konfigurierbarkeit entschieden, damit die Benutzer die Standards einhalten, anstatt ihre eigene Cruft auszurollen. Es wurde nie für den Fall gemacht, den Sie haben (dh private Repositories).
Fuz
@Shudipta Bitte hör mit den Änderungen auf. Die Fragen sehen schlimmer aus, als Sie es wollen.
Fuz
Schöne Dokumentation. Hat mein Leben gerettet.
Anish Varghese
34

Ich hatte ein Problem mit der go getVerwendung des privaten Repositorys auf Gitlab unserer Firma. Ich habe ein paar Minuten verloren, um eine Lösung zu finden. Und ich habe diesen gefunden:

  1. Sie benötigen ein privates Token unter:
    https://gitlab.mycompany.com/profile/account

  2. Konfigurieren Sie git so, dass mit Ihrem privaten Token ein zusätzlicher Header hinzugefügt wird:

    $ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
  3. Konfigurieren Sie Ihr Git so, dass Anforderungen von http nach ssh konvertiert werden :

    $ git config --global url."[email protected]:".insteadOf "https://gitlab.mycompany.com/"
  4. Endlich können Sie Ihre go getnormalen verwenden:

    $ go get gitlab.com/company/private_repo
Rodrigo Oliveira
quelle
3
Interessante Verwendung von http.extraheader. +1
VonC
29
Wird --globalIhr privates Token auch an einen anderen Git-Server gesendet, falls Sie viele Repos verwenden? ein sicheres Risiko?
secmask
Hat jemand eine Bewertung dazu? Ich denke, es wird an das öffentliche Github-Repo gesendet, wenn wir uns auf sie
einlassen
13

All das hat bei mir nicht funktioniert. Das Klonen des Repos funktionierte korrekt, aber ich bekam immer noch einen unrecognized importFehler.

Da es für Go v1.13 steht, habe ich im Dokument festgestellt, dass wir die GOPRIVATE env-Variable wie folgt verwenden sollten :

$ GOPRIVATE=github.com/ORGANISATION_OR_USER_NAME go get -u github.com/ORGANISATION_OR_USER_NAME/REPO_NAME
Jolancornevin
quelle
10

Das sieht aus wie das GitLab-Problem 5769 .

Da die Repositorys in GitLab immer enden .git, muss ich .gitam Ende des Repository-Namens angeben , damit es funktioniert, zum Beispiel:

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

Und:

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

GitHub löst dieses Problem anscheinend durch Anhängen ".git".

Es soll unter „ Unterstützung für das Abrufen des Go-Repositorys hinzugefügt “ behoben werden. # 5958 ”, vorausgesetzt, die richtigen Meta-Tags sind vorhanden .
Obwohl es für Go selbst immer noch ein Problem gibt: " cmd/go: go get kann kein Meta-Tag in HTML5-Dokumenten erkennen ".

VonC
quelle
Eigentlich haben sie (und andere) bereits Meta-Tags unterstützt, aber es funktioniert nur für öffentliches Repo (wo go getMeta-Tags ohne Login
angezeigt werden können
@secmask, weshalb Sie ssh: verwenden, um die Anmeldeinformationen auf diese Weise bereitzustellen.
VonC
Oh, diese einfache Option, ich kann http, https to verwenden, aber der go getBefehl sieht so aus go get gitlab.com/secmask/awserver-go.git.git(fragt nach der http-Basisauthentifizierung), was auch nicht gut aussieht.
Sek. Maske
8

Generieren Sie ein Github OAuth - Token hier und exportieren Sie Ihre GitHub als Umgebungsvariable Token:

export GITHUB_TOKEN=123

Stellen Sie git config so ein, dass die grundlegende Auth-URL verwendet wird:

git config --global url."https://$GITHUB_TOKEN:[email protected]/".insteadOf "https://github.com/"

Jetzt können Sie go getIhr privates Repo.

Miguel Mota
quelle
5

Ich habe eine benutzerspezifische ssh-config erstellt, sodass sich mein Benutzer automatisch mit den richtigen Anmeldeinformationen und dem richtigen Schlüssel anmeldet.

Zuerst musste ich ein Schlüsselpaar generieren

ssh-keygen -t rsa -b 4096 -C "[email protected]"

und speicherte es zB ~/.ssh/id_my_domain. Beachten Sie, dass dies auch das Schlüsselpaar (privat und öffentlich) ist, das ich mit meinem Github-Konto verbunden habe, sodass mein Konto in gespeichert ist ~/.ssh/id_github_com.

Ich habe dann eine Datei ~/.ssh/configmit einem Eintrag erstellt (oder geändert) :

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

Auf einem anderen Server lautet die "ssh-url" [email protected]:username/private-repo.gitund der Eintrag für diesen Server wäre gewesen:

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

Nur um zu verdeutlichen, dass Sie sicherstellen müssen, dass das User, Hostund HostNamerichtig eingestellt ist.

Jetzt kann ich einfach in den Go-Pfad navigieren und dann go get <package>, z. B. go get mainwo die Datei main/main.godas Paket enthält (aus dem letzten Beispiel oben) domain.com:username/private-repo.git.

Joachim
quelle
Sie können ein Paket auch direkt importieren mit: go get hostname.com/username/repo.git(Die Erweiterung .git ist entscheidend).
Joachim
Gibt es eine Möglichkeit, dies ohne die Erweiterung zu tun, .gitund warum passiert es?
Cristian Chaparro A.
1
Interessant ist der Grund , weil ich den Repo zu bekommen, ohne die nicht in der Lage sein .gitErweiterung war es , dass auf meinem lokalen git Konfiguration git config --global url."[email protected]:".insteadOf "https://gitlab.myserver.com/", aber die Sub - Domain gitlab.myserver.comnicht die ssl - Zertifizierung hat, so dass ich httpstatt https, jetzt
Cristian Chaparro A.
3

Ich bin darauf gestoßen .netrcund fand es relevant dafür.

Erstellen Sie eine Datei ~/.netrcmit folgendem Inhalt:

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

Getan!

Für die neuesten GO-Versionen müssen Sie dies möglicherweise zu den Umgebungsvariablen hinzufügen GOPRIVATE=github.com (ich habe es zu meinen hinzugefügt .zshrc).

netrc Außerdem wird die Einrichtung meiner Entwicklungsumgebung verbessert, da mein persönlicher Github-Zugriff für HTTPS jetzt so konfiguriert ist, dass er auf dem gesamten Computer verwendet werden kann (genau wie meine SSH-Konfiguration).

Generieren Sie GitHub-Token für den persönlichen Zugriff: https://github.com/settings/tokens

Wenn Sie bei der SSH-Authentifizierung bleiben möchten, maskieren Sie die Anforderung, ssh zwangsweise zu verwenden

git config --global url."[email protected]:".insteadOf "https://github.com/"

Weitere Methoden zum Einrichten des Git-Zugriffs: https://gist.github.com/technoweenie/1072829#gistcomment-2979908

Weitere Informationen zur Verwendung mit Git unter Windows finden Sie in der Manpage und in dieser Antwort

Kanak Singhal
quelle
2

Für mich haben die von anderen angebotenen Lösungen immer noch den folgenden Fehler ergeben go get

[email protected]: Berechtigung verweigert (publickey). fatal: Konnte nicht aus dem Remote-Repository lesen. Stellen Sie sicher, dass Sie über die richtigen Zugriffsrechte verfügen und das Repository vorhanden ist.

Was diese Lösung erforderte

  1. Wie von anderen angegeben:

    git config --global url."[email protected]:".insteadOf "https://github.com/"

  2. Entfernen der Passphrase aus meinem ./ssh/id_rsaSchlüssel, der zur Authentifizierung der Verbindung zum Repository verwendet wurde. Dies kann durch Eingabe eines leeren Passworts erfolgen, wenn Sie als Antwort auf Folgendes aufgefordert werden:

    ssh-keygen -p

Warum das funktioniert

Dies ist keine schöne Problemumgehung, da es immer besser ist, eine Passphrase für Ihren privaten Schlüssel zu haben, aber es hat irgendwo in OpenSSH Probleme verursacht.

go getverwendet intern git, das openssh verwendet, um die Verbindung zu öffnen. OpenSSH übernimmt die für die Authentifizierung erforderlichen Zertifikate von .ssh/id_rsa. Wenn Sie git-Befehle über die Befehlszeile ausführen, kann ein Agent dafür sorgen, dass die Datei id_rsa für Sie geöffnet wird, damit Sie nicht jedes Mal die Passphrase angeben müssen Fall. OpenSSH möchte Sie dann zur Eingabe eines Kennworts auffordern. Da dies jedoch aufgrund des Aufrufs nicht möglich ist, wird es in das Debug-Protokoll gedruckt:

read_passphrase: kann / dev / tty nicht öffnen: Kein solches Gerät oder keine solche Adresse

Und scheitert einfach. Wenn Sie die Passphrase aus der Schlüsseldatei entfernen, gelangt OpenSSH ohne diese Eingabeaufforderung zu Ihrem Schlüssel und es funktioniert

Dies kann dadurch verursacht werden, dass Go gleichzeitig Module abruft und mehrere SSH-Verbindungen zu Github gleichzeitig öffnet (wie in diesem Artikel beschrieben ). Dies wird etwas durch die Tatsache unterstützt, dass das OpenSSH-Debug-Protokoll die anfängliche Verbindung zum Repository als erfolgreich anzeigte, es aber später aus irgendeinem Grund erneut versuchte und diesmal nach einer Passphrase fragte.

Die im genannten Artikel beschriebene Lösung der Verwendung von SSH-Verbindungsmultiplexing hat bei mir jedoch nicht funktioniert. Für die Aufzeichnung schlug der Autor vor, die folgende Konfektion zur SSH-Konfigurationsdatei für den betroffenen Host hinzuzufügen:

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

Aber wie gesagt, für mich hat es nicht funktioniert, vielleicht habe ich es falsch gemacht

Tarmo
quelle