$ go get
Po 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 .git
rozszerzeniem z nazwą mojego projektu mogę zmienić nazwę na oryginalną, ale robienie tego za każdym razem $ go get
nie jest tak dobre, czy jest inny sposób?
GOPRIVATE
również. np.export GOPRIVATE="github.com/steelx/that-private-repo"
Odpowiedzi:
Musisz skonfigurować jedną rzecz. Przykład jest oparty na GitHub, ale nie powinno to zmienić procesu:
źródło
cat
polecenie służy tylko do weryfikacji.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 -u
do zaktualizowania pakietu igo install
zainstalowania go. Pakiet o nazwiewchodzi w
Wprowadzane polecenia to:
źródło
go get
został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).Miałem problem z
go get
korzystaniem z prywatnego repozytorium na gitlab od naszej firmy. Straciłem kilka minut, próbując znaleźć rozwiązanie. I znalazłem ten:Musisz uzyskać prywatny token pod adresem :
https://gitlab.mycompany.com/profile/account
Skonfiguruj git, aby dodać dodatkowy nagłówek z prywatnym tokenem:
Skonfiguruj swojego gita, aby konwertował żądania z http na ssh :
Wreszcie możesz użyć swojego
go get
normalnego:źródło
http.extraheader
. +1--global
również twój prywatny token na inny serwer git w przypadku korzystania z wielu repozytoriów? jakieś bezpieczne ryzyko?Wszystkie powyższe nie działają dla mnie. Klonowanie repozytorium działało poprawnie, ale nadal otrzymywałem
unrecognized import
błąd.Ponieważ oznacza Go v1.13, w dokumencie stwierdziłem, że powinniśmy użyć zmiennej env GOPRIVATE w następujący sposób:
źródło
Jeśli masz już git przy użyciu SSH, ta odpowiedź przez Ammar Bandukwala jest proste obejście:
$ go get
używagit
wewnętrznie. Następujące linery utworzągit
i w konsekwencji$ go get
sklonują twój pakiet przez SSH.Github:
BitBucket:
źródło
To wygląda na wydanie GitLab 5769 .
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 ”.źródło
go get
można zobaczyć metatagi bez logowania)go get
polecenie 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.Wygeneruj tutaj token github oauth i wyeksportuj swój token github jako zmienną środowiskową:
Ustaw konfigurację git tak, aby używała podstawowego adresu URL uwierzytelniania:
Teraz możesz
go get
swoje prywatne repozytorium.źródło
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
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/config
z wpisem:Na innym serwerze „ssh-url” to,
[email protected]:username/private-repo.git
a wpis dla tego serwera wyglądałby tak:Wystarczy, aby wyjaśnić, że musi się upewnić, że
User
,Host
iHostName
jest ustawiony prawidłowo.Teraz mogę po prostu przejść do ścieżki go i wtedy
go get <package>
np.go get main
Gdzie plikmain/main.go
zawiera pakiet (z ostatniego przykładu powyżej)domain.com:username/private-repo.git
.źródło
go get hostname.com/username/repo.git
(rozszerzenie .git jest kluczowe)..git
i dlaczego tak się dzieje?.git
rozszerzenia było to na mojej lokalnej konfiguracji gitagit config --global url."[email protected]:".insteadOf "https://gitlab.myserver.com/"
, ale subdomenagitlab.myserver.com
nie ma certyfikatu ssl, więchttp
zamiast tego używamhttps
już terazNatknąłem się
.netrc
i stwierdziłem, że ma to znaczenie.Utwórz plik
~/.netrc
z następującą zawartością: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
źródło
U mnie rozwiązania oferowane przez innych nadal dawały następujący błąd podczas
go get
Czego wymagało to rozwiązanie
Jak stwierdzili inni:
git config --global url."[email protected]:".insteadOf "https://github.com/"
Usunięcie hasła z mojego
./ssh/id_rsa
klucza, 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 get
uż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: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:
Ale jak stwierdzono, dla mnie to nie zadziałało, może zrobiłem to źle
źródło