Qual è il modo corretto di "andare a prendere" un repository privato?


143

Sto cercando il modo di $ go getlavorare con un repository privato, dopo aver provato molti google.

Il primo tentativo:

$ 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

Sì, non ha visto i meta tag perché non sapevo come fornire le informazioni di accesso.

Il secondo tentativo:

Segui https://gist.github.com/shurcooL/6927554 . Aggiungi config a .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

Sì, funziona, ma con l' .gitestensione con il nome del mio progetto, posso rinominarlo in originale ma farlo ogni volta che $ go getnon è così buono, c'è un altro?


2
dopo aver seguito la risposta di seguito assicurati di esportare GOPRIVATEanche. ad es.export GOPRIVATE="github.com/steelx/that-private-repo"
ACCIAIO

Risposte:


91

Hai una cosa da configurare. L'esempio si basa su GitHub ma questo non dovrebbe cambiare il processo:

$ 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

L'ho già fatto, in realtà è solo una configurazione da fare, il catcomando è solo per la verifica.
Maschera di protezione

1
L'unico inconveniente è che non è possibile avere una configurazione diversa per ciascun host (ad esempio se si utilizzano più provider) senza modificare la configurazione globale di git per ogni volta. Quindi è molto meglio specificarlo a «livello ssh» come descritto lei: stackoverflow.com/questions/27500861/…
Joachim

1
Vorrei che questo fosse votato più in alto. Anche per i repository pubblici, preferisco usare ssh ove possibile, poiché due fattori rendono imbarazzante l'autenticazione della password. Questo corregge tutti i repository github su URL ssh. Grazie!
captncraig,

53

Il modo corretto è posizionare manualmente il repository nel posto giusto. Una volta che il repository è presente, è possibile utilizzare go get -uper aggiornare il pacchetto e go installinstallarlo. Un pacchetto chiamato

github.com/secmask/awserver-go

entra

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

I comandi digitati sono:

cd $GOPATH/src/github.com/secmask
git clone git@github.com:secmask/awserver-go.git

5
@secmask go getè progettato come uno strumento per il caso comune. Il team Go ha deciso esplicitamente di non aggiungere la configurabilità in modo che le persone aderiscano agli standard invece di implementare la propria cruft. Non è mai stato creato per il caso che hai (ovvero repository privati).
fuz,

@Shudipta Per favore basta con le modifiche. Le domande sembrano peggiori nel modo desiderato.
fuz,

Bella documentazione. Salvato la mia vita.
Anish Varghese,

34

Ho avuto un problema con l' go getutilizzo del repository privato su gitlab della nostra azienda. Ho perso qualche minuto cercando di trovare una soluzione. E ho trovato questo:

  1. Devi ottenere un token privato su:
    https://gitlab.mycompany.com/profile/account

  2. Configura git per aggiungere un'intestazione aggiuntiva con il tuo token privato:

    $ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
  3. Configura git per convertire le richieste da http a ssh :

    $ git config --global url."git@gitlab.mycompany.com:".insteadOf "https://gitlab.mycompany.com/"
  4. Finalmente puoi usare go getnormalmente:

    $ go get gitlab.com/company/private_repo

3
Uso interessante di http.extraheader. +1
VonC,

29
invierà --globalanche il tuo token privato ad altri server git nel caso in cui utilizzi molti repo? qualche rischio sicuro?
maschera antigas

Qualcuno ha qualche recensione al riguardo? Penso che lo invierà al repository pubblico di github quando andremo a prenderli
hemu

13

Tutto quanto sopra non ha funzionato per me. La clonazione del repository funzionava correttamente ma continuavo a ricevere un unrecognized importerrore.

Come sta per Go v1.13, ho trovato nel documento che dovremmo usare la variabile env GOPRIVATE in questo modo:

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

10

Se hai già avuto git usando SSH, questa risposta di Ammar Bandukwala è una soluzione semplice:


$ go getutilizza gitinternamente. La seguente linea farà gite di conseguenza $ go getclonerà il pacchetto tramite 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

Sembra il problema GitLab 5769 .

In GitLab, poiché i repository finiscono sempre .git, devo specificare .gitalla fine del nome del repository per farlo funzionare, ad esempio:

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

E:

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

Sembra che GitHub risolva questo aggiungendo ".git".

Dovrebbe essere risolto in " Aggiunto supporto per il recupero del repository Go. # 5958 ", a condizione che siano presenti i meta tag corretti .
Anche se c'è ancora un problema per Go stesso: " cmd/go: go get non riesce a scoprire il meta tag nei documenti HTML5 ".


In realtà essi (e non solo) ha già sostenuto meta tag, ma semplicemente funziona per repo pubblico (dove go getpuò vedere meta tag senza login)
secmask

@secmask che è il motivo per cui stai usando ssh: per fornire le credenziali in quel modo.
VonC,

oh, quell'unica opzione, posso usare http, https ma il go getcomando sarà simile go get gitlab.com/secmask/awserver-go.git.git(chiederà http autenticazione di base), che non sembra buono.
maschera di protezione

8

Generare un github token OAuth qui ed esportare il github token come una variabile di ambiente:

export GITHUB_TOKEN=123

Imposta git config per usare l'URL di autenticazione di base:

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

Ora puoi il go gettuo repository privato.


5

Ho creato un ssh-config specifico dell'utente, quindi il mio utente accede automaticamente con le credenziali e la chiave corrette.

Per prima cosa avevo bisogno di generare una coppia di chiavi

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

e salvato ad es ~/.ssh/id_my_domain. Nota che questa è anche la coppia di chiavi (privata e pubblica) che ho collegato al mio account Github, quindi la mia è memorizzata ~/.ssh/id_github_com.

Ho quindi creato (o modificato) un file chiamato ~/.ssh/configcon una voce:

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

Su un altro server, "ssh-url" è admin@domain.com:username/private-repo.gite la voce per questo server sarebbe stata:

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

Solo per chiarire che è necessario assicurarsi che User, Hoste HostNamesia impostato correttamente.

Ora posso semplicemente navigare nel percorso go e quindi go get <package>, ad esempio, go get maindove il file main/main.goinclude il pacchetto (dall'ultimo esempio sopra) domain.com:username/private-repo.git.


Puoi anche importare un pacchetto direttamente con: go get hostname.com/username/repo.git(l'estensione .git è cruciale).
Gioacchino

c'è un modo per farlo senza l'estensione .gite perché succede?
Cristian Chaparro A.

1
Interessante, la ragione perché io non essere in grado di ottenere il pronti contro termine, senza l' .gitestensione è stato che su mia configurazione git locale git config --global url."git@gitlab.myserver.com:".insteadOf "https://gitlab.myserver.com/", ma il sottodominio gitlab.myserver.comnon ha la certificazione SSL, per cui uso http, invece di https, ormai
Cristian Chaparro A.

3

Mi sono imbattuto .netrce l' ho trovato rilevante per questo.

Crea un file ~/.netrccon il seguente contenuto:

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

Fatto!

Inoltre, per le ultime versioni di GO, potrebbe essere necessario aggiungere questo alle variabili di ambiente GOPRIVATE=github.com (l'ho aggiunto al mio .zshrc)

netrc migliora anche la configurazione del mio ambiente di sviluppo poiché l'accesso personale a github per HTTPS è ora configurato per essere utilizzato su tutta la macchina (proprio come la mia configurazione SSH).

Genera token di accesso personali GitHub: https://github.com/settings/tokens

Se si desidera attenersi all'autenticazione SSH, mascherare la richiesta per usare ssh con forza

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

Altri metodi per configurare l'accesso git: https://gist.github.com/technoweenie/1072829#gistcomment-2979908

Vedi la pagina man e questa risposta per il suo utilizzo specifico con Git su Windows


2

Per me, le soluzioni offerte da altri davano ancora il seguente errore durante go get

git@gl.nimi24.com: autorizzazione negata (chiave pubblica). fatale: impossibile leggere dal repository remoto. Assicurarsi di disporre dei diritti di accesso corretti e che il repository esista.

Ciò che questa soluzione ha richiesto

  1. Come affermato da altri:

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

  2. Rimozione della passphrase dalla mia ./ssh/id_rsachiave che è stata utilizzata per autenticare la connessione al repository. Questo può essere fatto inserendo una password vuota quando richiesto come risposta a:

    ssh-keygen -p

Perché questo funziona

Questa non è una soluzione alternativa poiché è sempre meglio avere una passphrase sulla chiave privata, ma stava causando problemi da qualche parte all'interno di OpenSSH.

go getusa internamente git, che usa openssh per aprire la connessione. OpenSSH prende i certificati necessari per l'autenticazione da .ssh/id_rsa. Quando si eseguono comandi git dalla riga di comando, un agente può occuparsi di aprire il file id_rsa per te in modo da non dover specificare la passphrase ogni volta, ma quando eseguito nella pancia di go get, questo non ha funzionato in qualche modo nel mio Astuccio. OpenSSH vuole quindi richiedere una password ma poiché non è possibile a causa di come è stato chiamato, stampa nel suo registro di debug:

read_passphrase: impossibile aprire / dev / tty: nessun dispositivo o indirizzo

E fallisce e basta. Se rimuovi la passphrase dal file della chiave, OpenSSH accederà alla tua chiave senza quel prompt e funzionerà

Ciò potrebbe essere causato dal fatto che Go recupera i moduli contemporaneamente e apre contemporaneamente più connessioni SSH a Github (come descritto in questo articolo ). Ciò è in qualche modo supportato dal fatto che il registro di debug di OpenSSH ha mostrato che la connessione iniziale al repository ha avuto esito positivo, ma in seguito ha provato di nuovo per qualche motivo e questa volta ha optato per richiedere una passphrase.

Tuttavia, la soluzione dell'utilizzo del multiplexing della connessione SSH, come avanzata nell'articolo citato, non ha funzionato per me. Per la cronaca, l'autore ha suggerito di aggiungere il conf collowing al file di configurazione ssh per l'host interessato:

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

Ma come detto, per me non ha funzionato, forse ho sbagliato

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.