Jaki jest właściwy sposób „zdobycia” prywatnego repozytorium?

143

$ go getPo wielu próbach w Google szukam sposobu na pracę z prywatnym repozytorium.

Pierwsza próba:

$ 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

Tak, nie widziałem metatagów, ponieważ nie wiedziałem, jak podać dane logowania.

Druga próba:

Śledź https://gist.github.com/shurcooL/6927554 . Dodaj konfigurację do .gitconfig.

[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

Tak, to działa, ale z .gitrozszerzeniem z nazwą mojego projektu mogę zmienić nazwę na oryginalną, ale robienie tego za każdym razem $ go getnie jest tak dobre, czy jest inny sposób?

secmask
źródło
2
po wykonaniu poniższej odpowiedzi pamiętaj o wyeksportowaniu GOPRIVATErównież. np.export GOPRIVATE="github.com/steelx/that-private-repo"
STAL

Odpowiedzi:

91

Musisz skonfigurować jedną rzecz. Przykład jest oparty na GitHub, ale nie powinno to zmienić procesu:

$ 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
źródło
Już to zrobiłem, właściwie to tylko jedna konfiguracja do zrobienia, catpolecenie służy tylko do weryfikacji.
secmask
1
Jedyną wadą jest to, że nie możesz mieć innej konfiguracji dla każdego hosta (np. Jeśli używasz wielu dostawców) bez zmiany globalnej konfiguracji git za każdym razem. W takim razie znacznie lepiej jest określić to na poziomie „ssh-level”, jak ją opisała: stackoverflow.com/questions/27500861/…
Joachim
1
Chciałbym, żeby to zostało ocenione wyżej. Nawet w przypadku publicznych repozytoriów wolę używać ssh wszędzie tam, gdzie to możliwe, ponieważ dwa czynniki sprawiają, że uwierzytelnianie hasła jest niewygodne. To naprawia wszystkie repozytoria github na adresy URL ssh. Dzięki!
captncraig
53

Właściwym sposobem jest ręczne umieszczenie repozytorium we właściwym miejscu. Gdy repozytorium już się pojawi, możesz użyć go go get -udo zaktualizowania pakietu i go installzainstalowania go. Pakiet o nazwie

github.com/secmask/awserver-go

wchodzi w

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

Wprowadzane polecenia to:

cd $GOPATH/src/github.com/secmask
git clone git@github.com:secmask/awserver-go.git
fuz
źródło
5
@secmask go getzostało zaprojektowane jako narzędzie do typowych przypadków. Zespół Go wyraźnie zdecydował się nie dodawać konfigurowalności, aby ludzie przestrzegali standardów zamiast rozwijać własne okrucieństwo. Nigdy nie został stworzony dla Twojego przypadku (tj. Prywatnych repozytoriów).
fuz
@Shudipta Proszę, zakończ edycję. Pytania wyglądają gorzej tak, jak chcesz.
fuz
Niezła dokumentacja. Uratował mi życie.
Anish Varghese
34

Miałem problem z go getkorzystaniem z prywatnego repozytorium na gitlab od naszej firmy. Straciłem kilka minut, próbując znaleźć rozwiązanie. I znalazłem ten:

  1. Musisz uzyskać prywatny token pod adresem :
    https://gitlab.mycompany.com/profile/account

  2. Skonfiguruj git, aby dodać dodatkowy nagłówek z prywatnym tokenem:

    $ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
  3. Skonfiguruj swojego gita, aby konwertował żądania z http na ssh :

    $ git config --global url."[email protected]:".insteadOf "https://gitlab.mycompany.com/"
  4. Wreszcie możesz użyć swojego go getnormalnego:

    $ go get gitlab.com/company/private_repo
Rodrigo Oliveira
źródło
3
Ciekawe użycie http.extraheader. +1
VonC
29
wyśle --globalrównież twój prywatny token na inny serwer git w przypadku korzystania z wielu repozytoriów? jakieś bezpieczne ryzyko?
secmask
Czy ktoś recenzuje to? Myślę, że wyśle ​​go do publicznego repozytorium github, kiedy się na nie dostaniemy
hemu
13

Wszystkie powyższe nie działają dla mnie. Klonowanie repozytorium działało poprawnie, ale nadal otrzymywałem unrecognized importbłąd.

Ponieważ oznacza Go v1.13, w dokumencie stwierdziłem, że powinniśmy użyć zmiennej env GOPRIVATE w następujący sposób:

$ GOPRIVATE=github.com/ORGANISATION_OR_USER_NAME go get -u github.com/ORGANISATION_OR_USER_NAME/REPO_NAME
jolancornevin
źródło
10

Jeśli masz już git przy użyciu SSH, ta odpowiedź przez Ammar Bandukwala jest proste obejście:


$ go getużywa gitwewnętrznie. Następujące linery utworzą giti w konsekwencji $ go getsklonują twój pakiet przez SSH.

Github:

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

BitBucket:

$ git config --global url."[email protected]:".insteadOf "https://bitbucket.org/"
Robert K. Bell
źródło
10

To wygląda na wydanie GitLab 5769 .

W GitLab, ponieważ repozytoria zawsze kończą się na .git, muszę podać .gitna końcu nazwę repozytorium, aby działało, na przykład:

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

I:

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

Wygląda na to, że GitHub rozwiązuje ten problem, dołączając ".git".

Ma to zostać rozwiązane w sekcji „ Dodano obsługę pobierania repozytorium Go. # 5958 ”, pod warunkiem, że istnieją odpowiednie metatagi .
Chociaż nadal istnieje problem z samym Go: „ cmd/go: go get nie może wykryć metatagu w dokumentach HTML5 ”.

VonC
źródło
Właściwie oni (i inni) już obsługują metatagi, ale działa to tylko dla repozytorium publicznego (gdzie go getmożna zobaczyć metatagi bez logowania)
secmask
@secmask, dlatego używasz ssh: do dostarczania poświadczeń w ten sposób.
VonC,
och, ta tylko opcja, mogę użyć http, https, ale go getpolecenie będzie wyglądać go get gitlab.com/secmask/awserver-go.git.git(poprosi o podstawowe uwierzytelnienie http), które też nie wyglądają dobrze.
secmask
8

Wygeneruj tutaj token github oauth i wyeksportuj swój token github jako zmienną środowiskową:

export GITHUB_TOKEN=123

Ustaw konfigurację git tak, aby używała podstawowego adresu URL uwierzytelniania:

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

Teraz możesz go getswoje prywatne repozytorium.

Miguel Mota
źródło
5

Utworzyłem specyficzny dla użytkownika ssh-config, więc mój użytkownik automatycznie loguje się z poprawnymi poświadczeniami i kluczem.

Najpierw musiałem wygenerować parę kluczy

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

i zapisałem go np ~/.ssh/id_my_domain. Zauważ, że jest to również para kluczy (prywatna i publiczna), którą połączyłem z moim kontem Github, więc moje jest przechowywane w ~/.ssh/id_github_com.

Następnie utworzyłem (lub zmieniłem) plik o nazwie ~/.ssh/configz wpisem:

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

Na innym serwerze „ssh-url” to, [email protected]:username/private-repo.gita wpis dla tego serwera wyglądałby tak:

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

Wystarczy, aby wyjaśnić, że musi się upewnić, że User, Hosti HostNamejest ustawiony prawidłowo.

Teraz mogę po prostu przejść do ścieżki go i wtedy go get <package>np. go get mainGdzie plik main/main.gozawiera pakiet (z ostatniego przykładu powyżej) domain.com:username/private-repo.git.

Joachim
źródło
Możesz także zaimportować pakiet bezpośrednio przez: go get hostname.com/username/repo.git(rozszerzenie .git jest kluczowe).
Joachim
czy można to zrobić bez rozszerzenia .giti dlaczego tak się dzieje?
Cristian Chaparro A.
1
Ciekawe, powód, dla którego nie mogę pobrać repozytorium, bez .gitrozszerzenia było to na mojej lokalnej konfiguracji gita git config --global url."[email protected]:".insteadOf "https://gitlab.myserver.com/", ale subdomena gitlab.myserver.comnie ma certyfikatu ssl, więc httpzamiast tego używam httpsjuż teraz
Cristian Chaparro A.
3

Natknąłem się .netrci stwierdziłem, że ma to znaczenie.

Utwórz plik ~/.netrcz następującą zawartością:

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

Gotowe!

Dodatkowo w przypadku najnowszych wersji GO może być konieczne dodanie tego do zmiennych środowiskowych GOPRIVATE=github.com (dodałem to do mojego .zshrc)

netrc poprawia również konfigurację mojego środowiska programistycznego, ponieważ mój osobisty dostęp do github dla protokołu HTTPS jest teraz skonfigurowany do użytku na całej maszynie (podobnie jak moja konfiguracja SSH).

Wygeneruj osobiste tokeny dostępu GitHub: https://github.com/settings/tokens

Jeśli chcesz pozostać przy uwierzytelnianiu SSH, zamaskuj na siłę żądanie użycia ssh

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

Więcej metod konfigurowania dostępu do git: https://gist.github.com/technoweenie/1072829#gistcomment-2979908

Zobacz stronę podręcznika systemowego i tę odpowiedź, aby dowiedzieć się, jak jest on używany z Git w systemie Windows

Kanak Singhal
źródło
2

U mnie rozwiązania oferowane przez innych nadal dawały następujący błąd podczas go get

[email protected]: Odmowa dostępu (publickey). krytyczny: nie można odczytać ze zdalnego repozytorium. Upewnij się, że masz odpowiednie prawa dostępu i repozytorium istnieje.

Czego wymagało to rozwiązanie

  1. Jak stwierdzili inni:

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

  2. Usunięcie hasła z mojego ./ssh/id_rsaklucza, który był używany do uwierzytelniania połączenia z repozytorium. Można to zrobić, wprowadzając puste hasło po wyświetleniu monitu w odpowiedzi na:

    ssh-keygen -p

Dlaczego to działa

Nie jest to dobre obejście, ponieważ zawsze lepiej jest mieć hasło do klucza prywatnego, ale powodowało to problemy gdzieś w OpenSSH.

go getużywa wewnętrznie git, który używa openssh do otwierania połączenia. OpenSSH pobiera certyfikaty niezbędne do uwierzytelnienia z .ssh/id_rsa. Podczas wykonywania poleceń git z wiersza poleceń agent może zająć się otwarciem pliku id_rsa za Ciebie, abyś nie musiał za każdym razem określać hasła, ale po wykonaniu w brzuchu go get, to nie zadziałało w moim walizka. OpenSSH chce wtedy poprosić o hasło, ale ponieważ nie jest to możliwe ze względu na sposób jego wywołania, drukuje w swoim dzienniku debugowania:

read_passphrase: nie można otworzyć / dev / tty: nie ma takiego urządzenia ani adresu

I po prostu zawodzi. Jeśli usuniesz hasło z pliku klucza, OpenSSH dostanie się do twojego klucza bez tego monitu i działa

Może to być spowodowane jednoczesnym pobieraniem modułów przez Go i jednoczesnym otwieraniem wielu połączeń SSH z Github (zgodnie z opisem w tym artykule ). Jest to w pewnym stopniu wspierane przez fakt, że dziennik debugowania OpenSSH pokazał, że początkowe połączenie z repozytorium powiodło się, ale później spróbowałem ponownie z jakiegoś powodu i tym razem zdecydowałem się poprosić o hasło.

Jednak rozwiązanie wykorzystujące multipleksowanie połączeń SSH przedstawione we wspomnianym artykule nie zadziałało dla mnie. Dla przypomnienia, autor zasugerował dodanie collowing conf do pliku konfiguracyjnego ssh dla danego hosta:

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

Ale jak stwierdzono, dla mnie to nie zadziałało, może zrobiłem to źle

Tarmo
źródło