วิธีที่ถูกต้องในการ "ไปรับ" พื้นที่เก็บข้อมูลส่วนตัวคืออะไร?


143

ฉันกำลังค้นหาวิธีที่จะ$ go getทำงานกับพื้นที่เก็บข้อมูลส่วนตัวหลังจากลอง google หลายครั้ง

ความพยายามครั้งแรก:

$ 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 เพิ่มการกำหนดค่าเป็น. 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

ใช่มันใช้งานได้ แต่ด้วย.gitส่วนขยายที่มีชื่อโครงการของฉันฉันสามารถเปลี่ยนชื่อมันเป็นต้นฉบับได้ แต่ทุกครั้งมัน$ go getไม่ดีเลยมีอีกไหม?


2
เมื่อคุณทำตามคำตอบด้านล่างให้แน่ใจว่าจะส่งออกGOPRIVATEเช่นกัน เช่นexport GOPRIVATE="github.com/steelx/that-private-repo"
STEEL

คำตอบ:


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คำสั่งสำหรับการตรวจสอบเท่านั้น
secmask

1
ข้อเสียเปรียบเพียงอย่างเดียวคือคุณไม่สามารถกำหนดค่าที่แตกต่างกันสำหรับแต่ละโฮสต์ (เช่นหากคุณใช้ผู้ให้บริการหลายราย) โดยไม่ต้องเปลี่ยนการกำหนดค่าโกลบอลคอมไพล์ในแต่ละครั้ง จากนั้นจะเป็นการดีกว่าที่จะระบุสิ่งนี้ใน« ssh-level »ตามที่อธิบายไว้: stackoverflow.com/questions/27500861/ …
Joachim

1
ฉันหวังว่าสิ่งนี้จะได้รับการโหวตให้สูงขึ้น แม้แต่ repos สาธารณะฉันชอบที่จะใช้ ssh ทุกที่ที่เป็นไปได้เนื่องจากมีสองปัจจัยที่ทำให้รหัสผ่านไม่น่าเชื่อ สิ่งนี้จะแก้ไข repos github ทั้งหมดเป็น ssh urls ขอบคุณ!
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
@smasmask go getได้รับการออกแบบเป็นเครื่องมือสำหรับกรณีทั่วไป ทีมงาน Go ตัดสินใจอย่างชัดเจนกับการเพิ่มความสามารถในการกำหนดค่าเพื่อให้ผู้คนปฏิบัติตามมาตรฐานแทนที่จะปล่อย cruft ของตนเอง มันไม่ได้ถูกสร้างขึ้นสำหรับกรณีที่คุณมี (เช่นที่เก็บส่วนตัว)
fuz

@Shudipta โปรดหยุดด้วยการแก้ไข คำถามดูแย่กว่าที่คุณต้องการ
fuz

เอกสารที่ดี ช่วยชีวิตฉันไว้.
Anish Varghese

34

ผมมีปัญหากับgo getการใช้พื้นที่เก็บข้อมูลส่วนตัวบนgitlabจาก บริษัท ของเรา ฉันเสียเวลาสองสามนาทีเพื่อหาทางแก้ไข และฉันเจออันนี้:

  1. คุณต้องรับโทเค็นส่วนตัวที่:
    https://gitlab.mycompany.com/profile/account

  2. กำหนดค่าคุณคอมไพล์เพื่อเพิ่มส่วนหัวพิเศษด้วยโทเค็นส่วนตัวของคุณ:

    $ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
  3. กำหนดค่าคอมไพล์ของคุณเพื่อแปลงคำขอจากhttpเป็นssh :

    $ 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 อื่น ๆ ในกรณีที่คุณใช้ repo มากมาย? มีความเสี่ยงหรือไม่?
secmask

ใครวิจารณ์อะไรบ้าง ฉันคิดว่ามันจะส่งไปยัง repo GitHub สาธารณะเมื่อเราทำไปรับพวกเขา
Hemu

13

จากทั้งหมดข้างต้นไม่ได้ผลสำหรับฉัน การโคลน repo ทำงานอย่างถูกต้อง แต่ฉันยังคงได้รับunrecognized importข้อผิดพลาด

เนื่องจากย่อมาจาก Go v1.13 ฉันพบในเอกสารว่าเราควรใช้ตัวแปร env GOPRIVATEดังนี้:

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

10

หากคุณได้รับคอมไพล์แล้วโดยใช้ SSH คำตอบนี้โดยAmmar Bandukwalaเป็นวิธีแก้ปัญหาง่ายๆ:


$ go getใช้gitภายใน ตอร์ปิโดหนึ่งอันต่อไปนี้จะสร้างgitขึ้นมาและทำการ$ go getโคลนแพ็กเกจของคุณผ่าน 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

รูปลักษณ์ที่เหมือนปัญหา GitLab 5769

ใน GitLab เนื่องจากที่เก็บจะสิ้นสุดเสมอ.gitฉันต้องระบุ.gitที่ท้ายชื่อที่เก็บเพื่อให้สามารถใช้งานได้ตัวอย่างเช่น:

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

และ:

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

ดูเหมือน GitHub ".git"แก้นี้โดยท้าย

มันควรจะได้รับการแก้ไขใน“ เพิ่มการสนับสนุนสำหรับการดึงที่เก็บของ Go # 5958 ” โดยระบุเมตาแท็กที่ถูกต้อง
แม้ว่าจะยังมีปัญหาสำหรับตัวเองไป:“ cmd/go: ไปรับไม่สามารถค้นพบเมตาแท็กในเอกสาร HTML5


ที่จริงแล้วพวกเขา (และคนอื่น ๆ ) ได้สนับสนุนเมตาแท็กแล้ว แต่มันก็ใช้ได้กับ repo สาธารณะ (ซึ่งgo getสามารถดูเมตาแท็กโดยไม่ต้องเข้าสู่ระบบ)
secmask

@secmask ซึ่งเป็นสาเหตุที่คุณใช้ ssh: เพื่อให้ข้อมูลประจำตัวในแบบนั้น
VonC

โอ้นั่นเป็นเพียงตัวเลือกฉันสามารถใช้ http, https เพื่อ แต่go getคำสั่งจะมีลักษณะgo get gitlab.com/secmask/awserver-go.git.git(จะถามการตรวจสอบสิทธิ์พื้นฐาน http) ซึ่งดูไม่ดีเช่นกัน
secmask

8

สร้าง github oauth token ที่นี่และส่งออก token github ของคุณเป็นตัวแปรสภาพแวดล้อม:

export GITHUB_TOKEN=123

ตั้งค่าคอนฟิก git เพื่อใช้ URL รับรองความถูกต้องพื้นฐาน:

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

ตอนนี้คุณสามารถgo getrepo ส่วนตัวของคุณ


5

ฉันได้สร้าง ssh-config เฉพาะผู้ใช้ดังนั้นผู้ใช้ของฉันเข้าสู่ระบบโดยอัตโนมัติด้วยข้อมูลประจำตัวที่ถูกต้องและคีย์

ก่อนอื่นฉันต้องสร้างคู่คีย์

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

~/.ssh/id_my_domainและบันทึกไว้เช่น ทราบว่านี้ยังเป็น keypair (ที่ภาครัฐและเอกชน) ผมเคยเชื่อมต่อกับบัญชี Github ~/.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 เป็นสิ่งสำคัญ)
Joachim

มีวิธีใดที่จะทำโดยไม่มีการขยาย.gitและทำไมมันเกิดขึ้น?
Cristian Chaparro A.

1
น่าสนใจสาเหตุที่ทำให้ฉันไม่สามารถซื้อ repo ได้โดยไม่ต้องมี.gitส่วนขยายเนื่องจากการตั้งค่า git ในพื้นที่ของฉันgit config --global url."git@gitlab.myserver.com:".insteadOf "https://gitlab.myserver.com/"แต่โดเมนย่อยgitlab.myserver.comไม่มีใบรับรอง SSL ดังนั้นฉันจึงใช้httpแทนhttpsตอนนี้
Cristian Chaparro A.

3

ฉันเจอ.netrcและพบว่าเกี่ยวข้องกับสิ่งนี้

สร้างไฟล์ที่~/.netrcมีเนื้อหาดังต่อไปนี้:

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

ทำ!

นอกจากนี้สำหรับเวอร์ชัน GO ล่าสุดคุณอาจต้องเพิ่มสิ่งนี้ในตัวแปรสภาพแวดล้อมGOPRIVATE=github.com (ฉันได้เพิ่มลงในของฉัน.zshrc)

netrc ยังทำให้การตั้งค่าสภาพแวดล้อมการพัฒนาของฉันดีขึ้นเนื่องจากมีการกำหนดค่าการเข้าถึง GitHub ส่วนตัวสำหรับ HTTPS ในขณะนี้เพื่อใช้กับเครื่อง (เช่นเดียวกับการกำหนดค่า SSH ของฉัน)

สร้างโทเค็นการเข้าถึงส่วนบุคคลของ GitHub: https://github.com/settings/tokens

หากคุณต้องการที่จะยึดติดกับการตรวจสอบความถูกต้องของ SSH จากนั้นปิดบังคำขอให้ใช้ ssh อย่างแข็งขัน

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

วิธีการเพิ่มเติมสำหรับการตั้งค่าการเข้าถึงคอมไพล์: https://gist.github.com/technoweenie/1072829#gistcomment-2979908

ดูหน้า manและคำตอบสำหรับการใช้กับ Git บน Windows โดยเฉพาะ


2

สำหรับฉันการแก้ปัญหาที่เสนอโดยผู้อื่นยังคงให้ข้อผิดพลาดต่อไปนี้ในระหว่าง go get

git@gl.nimi24.com: ปฏิเสธการอนุญาต (publickey) ร้ายแรง: ไม่สามารถอ่านจากที่เก็บระยะไกล โปรดตรวจสอบว่าคุณมีสิทธิ์การเข้าถึงที่ถูกต้องและมีที่เก็บข้อมูลอยู่

สิ่งที่ต้องการแก้ปัญหานี้

  1. ตามที่ระบุไว้โดยคนอื่น ๆ :

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

  2. การลบวลีรหัสผ่านจาก./ssh/id_rsaคีย์ของฉันซึ่งใช้สำหรับตรวจสอบสิทธิ์การเชื่อมต่อกับที่เก็บ สิ่งนี้สามารถทำได้โดยการป้อนรหัสผ่านที่ว่างเปล่าเมื่อได้รับแจ้งเป็นการตอบกลับไปที่:

    ssh-keygen -p

ทำไมถึงได้ผล

นี่ไม่ได้เป็นวิธีแก้ปัญหาที่ดีกว่าเพราะมันจะดีกว่าถ้ามีข้อความรหัสผ่านส่วนตัวของคุณ แต่มันทำให้เกิดปัญหาใน OpenSSH

go getใช้ git ภายในซึ่งใช้ openssh เพื่อเปิดการเชื่อมต่อ OpenSSH .ssh/id_rsaต้องใช้ใบรับรองที่จำเป็นสำหรับการตรวจสอบจาก เมื่อรันคำสั่ง git จากบรรทัดคำสั่งเอเจนต์สามารถดูแลการเปิดไฟล์ id_rsa ให้คุณเพื่อที่คุณจะได้ไม่ต้องระบุข้อความรหัสผ่านทุกครั้ง แต่เมื่อทำงานในช่วงเวลาที่ได้รับสิ่งนี้ไม่สามารถทำงานได้ กรณี. OpenSSH ต้องการให้คุณใส่รหัสผ่านจากนั้น แต่ไม่สามารถทำได้เนื่องจากมันถูกเรียกมันจึงพิมพ์ไปยังบันทึกการดีบัก:

read_passphrase: ไม่สามารถเปิด / dev / tty: ไม่มีอุปกรณ์หรือที่อยู่ดังกล่าว

และก็ล้มเหลว หากคุณลบข้อความรหัสผ่านจากไฟล์คีย์ OpenSSH จะไปถึงคีย์ของคุณโดยไม่แจ้งให้ทราบและจะใช้งานได้

นี้อาจจะเกิดจากการไปเรียกโมดูลพร้อมกันและการเปิดการเชื่อมต่อ SSH หลายเพื่อ Github ในเวลาเดียวกัน (ตามที่อธิบายไว้ในบทความนี้ ) สิ่งนี้ได้รับการสนับสนุนจากข้อเท็จจริงที่ว่าบันทึกการดีบักของ OpenSSH แสดงให้เห็นว่าการเชื่อมต่อเริ่มต้นกับที่เก็บประสบความสำเร็จ แต่หลังจากนั้นลองอีกครั้งด้วยเหตุผลบางประการและในเวลานี้เลือกที่จะขอข้อความรหัสผ่าน

อย่างไรก็ตามวิธีแก้ปัญหาของการใช้การเชื่อมต่อมัลติ SSH ตามที่หยิบยกในบทความที่กล่าวถึงไม่ได้ผลสำหรับฉัน สำหรับเร็กคอร์ดผู้เขียนแนะนำให้เพิ่ม collowing conf ไปยังไฟล์ ssh config สำหรับโฮสต์ที่ได้รับผลกระทบ:

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

แต่ตามที่ระบุไว้สำหรับฉันมันไม่ทำงานบางทีฉันอาจทำผิด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.