एक निजी रिपॉजिटरी "जाने" का उचित तरीका क्या है?


143

मैं $ go getकई गूगल की कोशिश के बाद, निजी भंडार के साथ काम करने का तरीका खोज रहा हूं ।

पहला प्रयास:

$ 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

हां, यह मेटा टैग नहीं देखा क्योंकि मुझे नहीं पता था कि लॉगिन जानकारी कैसे प्रदान की जाए।

दूसरी कोशिश:

Https://gist.github.com/shurcooL/6927554 का अनुसरण करें । To .conconfig में कॉन्फ़िगर करें।

[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

हां यह काम करता है लेकिन .gitमेरे प्रोजेक्ट नाम के साथ विस्तार के साथ, मैं इसे मूल नाम दे सकता हूं लेकिन क्या यह हर बार $ go getइतना अच्छा नहीं होता है, क्या कोई दूसरा रास्ता है?


2
एक बार जब आप नीचे दिए गए उत्तर का पालन करते हैं तो निर्यात करना सुनिश्चित करें GOPRIVATE। जैसेexport GOPRIVATE="github.com/steelx/that-private-repo"
स्टील

जवाबों:


91

कॉन्फ़िगर करने के लिए आपके पास एक चीज़ है। उदाहरण GitHub पर आधारित है लेकिन इस प्रक्रिया को बदलना नहीं चाहिए:

$ 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

पहले से ही ऐसा किया था, वास्तव में यह केवल एक ही करने के लिए है, catकमांड केवल सत्यापन के लिए है।
सेकंडमास्क

1
इसके साथ एकमात्र दोष यह है कि आपके पास प्रत्येक समय के लिए वैश्विक गिट कॉन्फ़िगरेशन में बदलाव किए बिना प्रत्येक होस्ट के लिए अलग-अलग कॉन्फ़िगरेशन हो सकता है (जैसे यदि आप कई प्रदाताओं का उपयोग कर रहे हैं)। फिर इसे «ssh- स्तर» पर निर्दिष्ट करना बेहतर है, जैसा कि उसका वर्णन किया गया है: stackoverflow.com/questions/27500861/…
जोकिम

1
काश यह उच्च मतदान होता। यहां तक ​​कि पब्लिक रिपॉज के लिए, मैं जहां भी संभव हो ssh का उपयोग करना पसंद करता हूं, क्योंकि दो फैक्टर पासवर्ड को अजीब बनाते हैं। यह url ssh के लिए सभी github repos को ठीक करता है। धन्यवाद!
captncraig

53

उचित तरीका यह है कि रिपॉजिटरी को सही जगह पर मैन्युअल रूप से रखा जाए। एक बार भंडार होने के बाद, आप go get -uपैकेज को अद्यतन करने और go installइसे स्थापित करने के लिए उपयोग कर सकते हैं । नाम का एक पैकेज

github.com/secmask/awserver-go

के अंदर जाता है

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

आपके द्वारा लिखी गई कमांड इस प्रकार हैं:

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

5
@secmask go getको सामान्य मामले के लिए एक उपकरण के रूप में तैयार किया गया है। गो टीम ने स्पष्ट रूप से विन्यास जोड़ने के खिलाफ फैसला किया ताकि लोग अपने स्वयं के क्रॉफ्ट को बाहर करने के बजाय मानकों का पालन करें। यह आपके (यानी निजी रिपॉजिटरी) मामले के लिए कभी नहीं बनाया गया था।
fuz

@ शुदीपति कृपया संपादन के साथ रुकें। प्रश्न जिस तरह से आप चाहते हैं, उससे भी बदतर दिखता है।
फ़ूज

अच्छा प्रलेखन। मेरी ज़िंदगी बचाई।
अनीश वर्गीज

34

मुझे हमारी कंपनी से गिटलैबgo get पर निजी भंडार का उपयोग करने में समस्या थी । मैं एक समाधान खोजने की कोशिश कर रहा कुछ मिनट खो दिया है। और मुझे यह पता चला:

  1. आपको यहां एक निजी टोकन प्राप्त करने की आवश्यकता है:
    https://gitlab.mycompany.com/profile/account

  2. अपने निजी टोकन के साथ अतिरिक्त हेडर जोड़ने के लिए आपको कॉन्फ़िगर करें:

    $ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
  3. HTTP से ssh में अनुरोध बदलने के लिए अपना git कॉन्फ़िगर करें :

    $ git config --global url."git@gitlab.mycompany.com:".insteadOf "https://gitlab.mycompany.com/"
  4. अंत में आप अपने go getसामान्य रूप से उपयोग कर सकते हैं :

    $ go get gitlab.com/company/private_repo

3
का रोचक उपयोग http.extraheader। +1
VONC

29
होगा --globalभी मामले में अन्य Git सर्वर से अपने निजी टोकन भेजने आप कई रेपो का उपयोग कर? कोई सुरक्षित जोखिम?
secmask

किसी को भी उस पर कोई समीक्षा? मुझे लगता है कि हम इसे सार्वजनिक जीथूब रेपो में भेजेंगे जब हम उन पर
चढ़ेंगे

13

उपरोक्त सभी ने मेरे लिए काम नहीं किया। रेपो क्लोनिंग सही ढंग से काम कर रहा था लेकिन मुझे अभी भी एक unrecognized importत्रुटि मिल रही थी ।

जैसा कि यह गो v1.13 के लिए खड़ा है, मैंने डॉक्टर में पाया कि हमें GOPRIVATE env वैरिएबल का उपयोग करना चाहिए :

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

10

आप पहले से ही SSH का उपयोग कर Git मिल गया है, तो क्या यह उत्तर से अम्मार Bandukwala एक सरल समाधान नहीं है:


$ go getgitआंतरिक रूप से उपयोग करता है । निम्नलिखित एक लाइनर बना देगा gitऔर परिणामस्वरूप $ go getSSH के माध्यम से आपके पैकेज को क्लोन कर देगा ।

Github:

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

बिट बकेट:

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

10

यह GitLab 5769 मुद्दे की तरह दिखता है ।

GitLab में, चूंकि रिपॉजिटरी हमेशा समाप्त होती हैं .git, इसलिए मुझे .gitयह काम करने के लिए रिपॉजिटरी नाम के अंत में निर्दिष्ट करना होगा , उदाहरण के लिए:

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

तथा:

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

लगता है GitHub इसे जोड़कर हल करता है ".git"

इसे गो के रिपॉजिटरी रिट्रीवल के लिए " एड सपोर्टेड " में हल किया जाना चाहिए # 5958 ”, बशर्ते सही मेटा टैग जगह में हों
हालाँकि अभी भी गो के लिए एक समस्या है: " cmd/go: जाओ जाओ HTML5 दस्तावेजों में मेटा टैग की खोज नहीं कर सकते "।


वास्तव में वे (और अन्य) पहले ही मेटा टैग का समर्थन कर चुके हैं, लेकिन यह सिर्फ पब्लिक रेपो के लिए काम करता है (जहां go getलॉगिन के बिना मेटा टैग देख सकते हैं)
secmask

@ secmask जिसके कारण आप ssh का उपयोग कर रहे हैं: इस तरह से क्रेडेंशियल्स प्रदान करने के लिए।
वॉन

ओह, यह सिर्फ विकल्प है, मैं http, https का उपयोग कर सकता हूं, लेकिन go getकमांड ऐसा दिखेगा go get gitlab.com/secmask/awserver-go.git.git(http बुनियादी प्रमाणीकरण पूछेगा), जो अच्छे भी नहीं लगते हैं।
सेकेंडमास्क

8

यहाँ एक गीथूब ऊहटन टोकन बनाएँ और एक पर्यावरण चर के रूप में अपने गीथूब टोकन का निर्यात करें:

export GITHUB_TOKEN=123

बुनियादी सामान्य url का उपयोग करने के लिए git कॉन्फिगर सेट करें:

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

अब आप go getअपने निजी रेपो कर सकते हैं ।


5

मैंने एक उपयोगकर्ता विशिष्ट ssh-config बनाया है, इसलिए मेरा उपयोगकर्ता स्वचालित रूप से सही क्रेडेंशियल्स और कुंजी के साथ लॉग इन करता है।

पहले मुझे एक की-जोड़ी बनाने की जरूरत थी

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

और इसे सेव करके उदा ~/.ssh/id_my_domain। ध्यान दें कि यह वह कीपर (निजी और सार्वजनिक) भी है जिसे मैंने अपने गितूब खाते से जोड़ा है, इसलिए मेरा इसमें संग्रहित है ~/.ssh/id_github_com

मैंने तब ~/.ssh/configएक प्रविष्टि के साथ एक फ़ाइल बनाई है (या बदल दी है) :

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

एक अन्य सर्वर पर, "ssh-url" है admin@domain.com:username/private-repo.gitऔर इस सर्वर के लिए प्रविष्टि इस प्रकार है:

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

बस यह स्पष्ट करने के लिए कि आपको यह सुनिश्चित करने की आवश्यकता है कि User, Hostऔर HostNameसही ढंग से सेट है।

अब मैं सिर्फ गो पथ में ब्राउज़ कर सकता हूं और फिर go get <package>, उदाहरण के लिए go get mainजहां फ़ाइल main/main.goमें पैकेज (ऊपर अंतिम उदाहरण से) शामिल है domain.com:username/private-repo.git


आप सीधे एक पैकेज भी आयात कर सकते हैं: go get hostname.com/username/repo.git(.गित एक्सटेंशन महत्वपूर्ण है)।
जोकिम

क्या बिना विस्तार के इसे करने का कोई तरीका है .gitऔर ऐसा क्यों होता है?
क्रिस्चियन चपरो A.

1
दिलचस्प, कारण है कि मैं रेपो प्राप्त करने में सक्षम नहीं हूं, इसके बिना .git विस्तार में यह अपने स्थानीय Git विन्यास पर कि था, git config --global url."git@gitlab.myserver.com:".insteadOf "https://gitlab.myserver.com/"है, लेकिन उप डोमेन gitlab.myserver.comSSL सत्यापन नहीं है, इसलिए मैं का उपयोग httpकरने के बजाय https, अब तक
क्रिस्टियन चापारो ए।

3

मैं भर आया .netrcऔर इसे इसके लिए प्रासंगिक पाया।

~/.netrcनिम्नलिखित सामग्री के साथ एक फ़ाइल बनाएँ :

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

किया हुआ!

इसके अतिरिक्त, नवीनतम GO संस्करणों के लिए, आपको इसे पर्यावरण चर में जोड़ना होगा GOPRIVATE=github.com (मैंने इसे अपने साथ जोड़ा है .zshrc)

netrc मेरे विकास के माहौल को भी बेहतर बनाता है क्योंकि HTTPS के लिए मेरा व्यक्तिगत github एक्सेस अब मशीन (मेरे SSH कॉन्फ़िगरेशन की तरह) में उपयोग किए जाने के लिए कॉन्फ़िगर किया गया है।

GitHub व्यक्तिगत पहुंच टोकन उत्पन्न करें: https://github.com/settings/tokens

यदि आप SSH प्रमाणीकरण के साथ रहना चाहते हैं, तो जोर से ssh का उपयोग करने के अनुरोध को मास्क करें

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

Git एक्सेस सेट करने के लिए और तरीके: https://gist.github.com/techn हेलोवीनie/1072829#gistcomment-29908

मैन पेज देखेंविशेष रूप से विंडोज पर गिट के साथ इसके उपयोग के लिए और इस उत्तर को


2

मेरे लिए, दूसरों द्वारा दिए गए समाधान अभी भी निम्नलिखित त्रुटि के दौरान दिए गए थे go get

git@gl.nimi/2010: अनुमति से इनकार (publickey)। घातक: दूरस्थ भंडार से नहीं पढ़ सकता था। कृपया सुनिश्चित करें कि आपके पास सही एक्सेस अधिकार हैं और रिपॉजिटरी मौजूद है।

इस समाधान की आवश्यकता क्या है

  1. जैसा कि दूसरों ने कहा है:

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

  2. मेरी ./ssh/id_rsaकुंजी से पासफ़्रेज़ को निकालना जो रिपॉजिटरी से कनेक्शन को प्रमाणित करने के लिए उपयोग किया गया था। प्रतिक्रिया के रूप में संकेत दिए जाने पर यह खाली पासवर्ड दर्ज करके किया जा सकता है:

    ssh-keygen -p

यह क्यों काम करता है

यह एक बहुत अच्छा समाधान नहीं है क्योंकि हमेशा आपकी निजी कुंजी पर पासफ़्रेज़ रखना बेहतर होता है, लेकिन यह ओपनएसएसएच के अंदर कहीं न कहीं समस्या पैदा कर रहा था।

go getआंतरिक रूप से गिट का उपयोग करता है, जो कनेक्शन खोलने के लिए ओपनश का उपयोग करता है। OpenSSH प्रमाणीकरण के लिए आवश्यक सीट्स लेता है .ssh/id_rsa। जब कमांड लाइन से गिट कमांड निष्पादित करते हैं, तो एक एजेंट आपके लिए id_rsa फ़ाइल खोलने का ध्यान रख सकता है ताकि आपको हर बार पासफ़्रेज़ निर्दिष्ट करने की आवश्यकता न हो, लेकिन जब गो के पेट में निष्पादित किया जाता है, तो यह मेरे लिए कुछ काम नहीं करता है मामला। OpenSSH आपको एक पासवर्ड के लिए संकेत देना चाहता है, लेकिन चूंकि इसे कैसे बुलाया जाता है, यह संभव नहीं है, यह इसके बड़े भाग को प्रिंट करता है:

read_passphrase: नहीं खोल सकता / dev / tty: ऐसा कोई उपकरण या पता नहीं

और बस असफल हो जाता है। यदि आप कुंजी फ़ाइल से पासफ़्रेज़ हटाते हैं, तो OpenSSH आपकी कुंजी को बिना उस संकेत के प्राप्त कर लेगा और यह काम करेगा

यह एक ही समय में Github में कई बार SSH कनेक्शन खोलने और ( इस लेख में बताए अनुसार) लाने के कारण हो सकता है )। यह इस तथ्य से कुछ हद तक समर्थित है कि ओपनएसएसएच डिबग लॉग ने रिपॉजिटरी के शुरुआती कनेक्शन को सफल होने के लिए दिखाया, लेकिन बाद में इसे किसी कारण से फिर से कोशिश की और इस बार पासफ़्रेज़ के लिए पूछने का विकल्प चुना।

हालाँकि SSH कनेक्शन मल्टीप्लेक्सिंग का उपयोग करने का समाधान जैसा कि उल्लेखित लेख में बताया गया है, मेरे लिए कारगर नहीं था। रिकॉर्ड के लिए, लेखक ने प्रभावित मेजबान के लिए ssh config फाइल में कोडिंग कॉन्फिडेंस जोड़ने का सुझाव दिया:

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

लेकिन जैसा कि कहा गया है, मेरे लिए यह काम नहीं किया, शायद मैंने इसे गलत किया

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.