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://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

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?


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 "git@github.com:"]
    insteadOf = https://github.com/
$ go get github.com/private/repo

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

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."git@gitlab.mycompany.com:".insteadOf "https://gitlab.mycompany.com/"
  4. Wreszcie możesz użyć swojego go getnormalnego:

    $ go get gitlab.com/company/private_repo

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

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."git@github.com:".insteadOf "https://github.com/"

BitBucket:

$ git config --global url."git@bitbucket.org:".insteadOf "https://bitbucket.org/"

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 ”.


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:x-oauth-basic@github.com/".insteadOf "https://github.com/"

Teraz możesz go getswoje prywatne repozytorium.


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 "my@email.here"

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, admin@domain.com: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.


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."git@gitlab.myserver.com:".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."git@github.com:".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


2

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

git@gl.nimi24.com: 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."git@github.com:".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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.