Özel bir depoyu "almanın" uygun yolu nedir?


143

$ go getBirçok google denedikten sonra, özel depo ile iş bulmanın yolunu arıyorum .

İlk deneme:

$ 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

Evet, meta etiketleri görmedi çünkü giriş bilgilerini nasıl sağlayacağımı bilemedim.

İkinci deneme:

Takip https://gist.github.com/shurcooL/6927554 . .Gitconfig dosyasına config ekleyin.

[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

Evet işe yarıyor ama .gitproje adımla uzantısı ile orijinal olarak yeniden adlandırabilirim ama her $ go getseferinde iyi değil mi, başka bir yol var mı?


2
Aşağıdaki cevabı takip ettikten sonra da dışa aktardığınızdan emin olun GOPRIVATE. ör.export GOPRIVATE="github.com/steelx/that-private-repo"
ÇELİK

Yanıtlar:


91

Yapılandırmanız gereken bir şey var. Örnek GitHub'a dayanmaktadır, ancak bu işlemi değiştirmemelidir:

$ 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

Bunu zaten yaptım, aslında sadece bir yapılandırma, catkomut sadece doğrulamak içindir.
Aralık'ta

1
Bunun tek dezavantajı, her zaman için global git yapılandırmasını değiştirmeden her ana bilgisayar için farklı yapılandırmaya sahip olamamanızdır (örneğin, birden çok sağlayıcı kullanıyorsanız). O zaman bunu "ssh-level" da tarif edildiği gibi belirtmek çok daha iyidir: stackoverflow.com/questions/27500861/…
Joachim

1
Keşke bunun daha yüksek oylanması. Herkese açık depolar için bile, ssh'ı mümkün olan her yerde kullanmayı tercih ederim, çünkü iki faktör parolayı doğru yapar. Bu, tüm github depolarını ssh url'lerine sabitler. Teşekkürler!
captncraig

53

Uygun yol, havuzu manuel olarak doğru yere koymaktır. Depo go get -ugeldiğinde, paketi güncellemek ve go installyüklemek için kullanabilirsiniz. Adlı bir paket

github.com/secmask/awserver-go

içeri girer

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

Yazdığınız komutlar:

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

5
@secmask go getgenel durum için bir araç olarak tasarlanmıştır. Go ekibi açıkça yapılandırılabilirlik eklemeye karar verdi, böylece insanlar kendi hamlelerini yaymak yerine standartlara uydular. Sahip olduğunuz dava için asla yapılmadı (yani özel depolar).
fuz

@Shudipta Lütfen düzenlemelerle durun. Sorular istediğiniz gibi daha kötü görünüyor.
fuz

Güzel belgeler. Hayatımı kurtardı.
Anish Varghese

34

Şirketimizden gitlabgo get üzerinde özel depo kullanımıyla ilgili bir sorun yaşadım . Bir çözüm bulmaya çalışırken birkaç dakika kaybettim. Bunu buldum:

  1. Özel bir jeton almanız gerekiyor:
    https://gitlab.mycompany.com/profile/account

  2. Git'i, özel simgenize fazladan başlık eklemek için yapılandırın:

    $ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
  3. Dönüştürürler istekleri için budala yapılandırma http için ssh :

    $ git config --global url."git@gitlab.mycompany.com:".insteadOf "https://gitlab.mycompany.com/"
  4. Son olarak go getnormalde kullanabilirsiniz :

    $ go get gitlab.com/company/private_repo

3
İlginç kullanımı http.extraheader. +1
VonC

29
olacak --globalayrıca birçok repo kullanarak durumunda diğer git sunucusuna özel simge gönderir? güvenli bir risk var mı?
secmask

Bu konuda yorum yapan var mı? Ben onları almak gitmek zaman kamu github repo gönderir düşünüyorum
hemu

13

Yukarıdakilerin hepsi benim için işe yaramadı. Repoyu klonlamak düzgün çalışıyordu ama halaunrecognized import hata .

Go v1.13 için olduğu gibi , GOPRIVATE env değişkenini şu şekilde kullanmamız gerektiğini dokümanda buldum :

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

10

Zaten SSH kullanarak budala var, bu cevap ile Ammar Bandukwala basit bir geçici çözüm:


$ go getgitdahili olarak kullanır . Aşağıdaki bir astar, paketinizi SSH yoluyla yapacak gitve sonuç olarak $ go getklonlayacaktır.

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

GitLab sorunu 5769'a benziyor .

GitLab'da, havuzlar her zaman sona erdiğinden, çalışmasını sağlamak için havuz adının sonunda .gitbelirtmeliyim .git, örneğin:

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

Ve:

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

GitHub bunu ekleyerek çözüyor gibi görünüyor ".git".

" Go'nun depo erişimine yönelik destek eklendi " bölümünde çözülmesi gerekiyor . # 5958 ”, doğru meta etiketlerin mevcut olması şartıyla .
Go'nun kendisi için hala bir sorun olsa da: “ cmd/go: go get HTML5 belgelerinde meta etiketi bulamıyor ”.


Aslında onlar (ve diğerleri) zaten meta etiketleri destekledi, ancak sadece halka açık repo için çalışıyor (burada go getgiriş olmadan meta etiketleri görebilir)
secmask

@secmask, bu nedenle kimlik bilgilerini bu şekilde sağlamak için ssh: kullanıyorsunuz.
VonC

oh, bu sadece seçenek, ben http, https kullanabilirsiniz ama go getkomut çok iyi görünmüyor go get gitlab.com/secmask/awserver-go.git.git(http temel kimlik doğrulaması isteyecektir), gibi görünecektir.
secmask

8

Burada bir github oauth jetonu oluşturun ve github jetonunuzu bir ortam değişkeni olarak dışa aktarın:

export GITHUB_TOKEN=123

Git config'i temel kimlik doğrulama URL'sini kullanacak şekilde ayarlayın:

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

Şimdi go getözel repo yapabilirsiniz .


5

Kullanıcıya özel bir ssh-config oluşturdum, bu yüzden kullanıcım otomatik olarak doğru kimlik bilgileri ve anahtarla oturum açıyor.

İlk önce bir anahtar çifti oluşturmam gerekiyordu

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

ve örneğin ~/.ssh/id_my_domain. Bunun aynı zamanda Github hesabıma bağladığım anahtar çifti (özel ve genel) olduğunu unutmayın, bu yüzden benimki depolanır ~/.ssh/id_github_com.

Daha sonra ~/.ssh/configbir girdi ile çağrılan bir dosya oluşturduk (veya değiştirdim) :

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

Başka bir sunucuda, "ssh-url" olur admin@domain.com:username/private-repo.gitve bu sunucunun girişi şu şekilde olur:

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

Sadece User, Hostve HostNamedoğru ayarlandığından emin olmak için.

Şimdi sadece go yoluna göz atabilirim ve sonra go get <package>, örneğin go get maindosyanın main/main.gopaketi içerdiği yerde (yukarıdaki son örnekten) domain.com:username/private-repo.git.


Bir paketi doğrudan aşağıdakilerle de içe aktarabilirsiniz: go get hostname.com/username/repo.git(.git uzantısı çok önemlidir).
Joachim

uzantı olmadan yapmanın bir yolu var mı .gitve neden oluyor?
Cristian Chaparro A.25

1
Ben olmadan, repo elde edebilmek yok neden İlginç, sebebi .gitbenim yerel git yapılandırmasına olmasıydı uzantısı, git config --global url."git@gitlab.myserver.com:".insteadOf "https://gitlab.myserver.com/"fakat alt alan gitlab.myserver.comkullandığım bu yüzden, ssl sertifikası yok httpyerine httpsartık,
Cristian Chaparro A.Nis

3

Karşılaştım .netrcve bununla ilgili buldum.

~/.netrcAşağıdaki içeriğe sahip bir dosya oluşturun :

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

Bitti!

Ayrıca, en son GO sürümleri için bunu ortam değişkenlerine eklemeniz gerekebilir GOPRIVATE=github.com (bunu ekledim .zshrc)

netrc HTTPS için kişisel github erişimim artık makinede kullanılacak şekilde yapılandırıldığı için (SSH yapılandırmam gibi) geliştirme ortamı kurulumumu daha iyi hale getiriyor.

GitHub kişisel erişim belirteçleri oluşturun: https://github.com/settings/tokens

SSH kimlik doğrulamasına sadık kalmak istiyorsanız, ssh'yi zorla kullanma isteğini maskeleyin

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

Git erişimini ayarlamak için daha fazla yöntem: https://gist.github.com/technoweenie/1072829#gistcomment-2979908

Bkz adam sayfasını ve bu cevabı özellikle Windows üzerinde Git ile kullanımı için


2

Benim için başkaları tarafından sunulan çözümler hala aşağıdaki hatayı verdi go get

git@gl.nimi24.com: İzin verilmedi (publickey). ölümcül: Uzak depodan okunamadı. Lütfen doğru erişim haklarına sahip olduğunuzdan ve havuzun var olduğundan emin olun.

Bu çözüm ne gerektirir

  1. Başkaları tarafından belirtildiği gibi:

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

  2. ./ssh/id_rsaDepo bağlantısının kimliğini doğrulamak için kullanılan anahtarımdaki parolayı kaldırma . Bu, aşağıdakilere yanıt olarak istendiğinde boş bir parola girerek yapılabilir:

    ssh-keygen -p

Bu neden çalışıyor?

Özel anahtarınızda parola bulundurmak her zaman daha iyi olduğu için bu oldukça geçici bir çözüm değildir, ancak OpenSSH içinde bir yerde sorunlara neden oluyordu.

go getbağlantıyı açmak için openssh kullanan dahili olarak git'i kullanır. OpenSSH, kimlik doğrulaması için gerekli sertifikaları buradan alır .ssh/id_rsa. Git komutlarını komut satırından yürütürken, bir ajan sizin için id_rsa dosyasını açmaya özen gösterebilir, böylece parolayı her seferinde belirtmek zorunda kalmazsınız, ancak gitme karnında yürütüldüğünde, bu benim durum. OpenSSH sizden bir parola istemek ister, ancak nasıl adlandırıldığından dolayı mümkün olmadığından hata ayıklama günlüğüne yazdırır:

read_passphrase: açılamıyor / dev / tty: Böyle bir cihaz veya adres yok

Ve başarısız oluyor. Parolayı anahtar dosyasından kaldırırsanız, OpenSSH bu istem olmadan anahtarınıza ulaşır ve çalışır

Buna Go modülleri aynı anda getirme ve Github'a aynı anda birden fazla SSH bağlantısı açma ( bu makalede açıklandığı gibi) neden olabilir . ). Bu, OpenSSH hata ayıklama günlüğünün depoya ilk bağlantıyı başarılı bir şekilde gösterdiğini, ancak daha sonra bir nedenden ötürü tekrar denediğini ve bu sefer bir parola istemeyi seçmesiyle biraz desteklenmektedir.

Bununla birlikte, bahsedilen makalede ortaya konduğu gibi SSH bağlantısı çoğullamasını kullanma çözümü benim için işe yaramadı. Kayıt için yazar, etkilenen ana bilgisayarın ssh yapılandırma dosyasına collapse conf eklemesini önerdi:

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

Ama belirtildiği gibi, benim için işe yaramadı, belki yanlış yaptım

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.