Apa cara yang tepat untuk "mendapatkan" repositori pribadi?


143

Saya mencari cara untuk mendapatkan $ go getpekerjaan dengan repositori pribadi, setelah banyak google mencoba.

Percobaan pertama:

$ 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

Yap, itu tidak melihat meta tag karena saya tidak tahu bagaimana memberikan informasi login.

Percobaan kedua:

Ikuti https://gist.github.com/shurcooL/6927554 . Tambahkan config ke .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

Ya itu bekerja tetapi dengan .gitekstensi dengan nama proyek saya, saya dapat mengubah nama menjadi asli tetapi melakukannya setiap kali $ go gettidak begitu baik, apakah ada cara lain?


2
setelah Anda mengikuti jawaban di bawah ini, pastikan untuk mengekspor GOPRIVATEjuga. misalnyaexport GOPRIVATE="github.com/steelx/that-private-repo"
STEEL

Jawaban:


91

Anda memiliki satu hal untuk dikonfigurasikan. Contoh ini didasarkan pada GitHub tetapi ini seharusnya tidak mengubah proses:

$ 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

Sudah melakukan itu, sebenarnya hanya satu konfigurasi yang harus dilakukan, catperintah hanya untuk memverifikasi.
secmask

1
Satu-satunya kelemahan dengan ini adalah Anda tidak dapat memiliki konfigurasi yang berbeda untuk setiap host (misalnya jika Anda menggunakan beberapa penyedia) tanpa mengubah konfigurasi global git untuk setiap waktu. Maka itu jauh lebih baik untuk menentukan ini pada «ssh-level» seperti yang dijelaskan padanya: stackoverflow.com/questions/27500861/…
Joachim

1
Saya berharap ini terpilih lebih tinggi. Bahkan untuk repo publik, saya lebih suka menggunakan ssh sedapat mungkin, karena dua faktor membuat kata sandi menjadi canggung. Ini memperbaiki semua repositori github ke url ssh. Terima kasih!
captncraig

53

Cara yang tepat adalah menempatkan repositori secara manual di tempat yang tepat. Setelah repositori ada, Anda dapat menggunakan go get -uuntuk memperbarui paket dan go installmenginstalnya. Paket bernama

github.com/secmask/awserver-go

pergi ke

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

Perintah yang Anda ketikkan adalah:

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

5
@secmask go getdirancang sebagai alat untuk kasus umum. Tim Go secara eksplisit memutuskan untuk tidak menambah kemungkinan konfigurasi sehingga orang-orang mematuhi standar alih-alih meluncurkan cruft mereka sendiri. Itu tidak pernah dibuat untuk kasus yang Anda miliki (yaitu repositori pribadi).
fuz

@Shudipta Tolong hentikan suntingan. Pertanyaannya terlihat lebih buruk seperti yang Anda inginkan.
fuz

Dokumentasi yang bagus. Menyelamatkan hidupku.
Anish Varghese

34

Saya punya masalah dengan go getmenggunakan repositori pribadi di gitlab dari perusahaan kami. Saya kehilangan beberapa menit mencoba menemukan solusi. Dan saya memang menemukan yang ini:

  1. Anda perlu mendapatkan token pribadi di:
    https://gitlab.mycompany.com/profile/account

  2. Konfigurasikan Anda git untuk menambahkan tajuk tambahan dengan token pribadi Anda:

    $ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
  3. Konfigurasikan git Anda untuk mengonversi permintaan dari http ke ssh :

    $ git config --global url."git@gitlab.mycompany.com:".insteadOf "https://gitlab.mycompany.com/"
  4. Akhirnya Anda dapat menggunakan Anda secara go getnormal:

    $ go get gitlab.com/company/private_repo

3
Penggunaan menarik dari http.extraheader. +1
VonC

29
--globaljuga akan mengirim token pribadi Anda ke server git lain jika Anda menggunakan banyak repo? ada risiko aman?
secmask

Adakah yang mengulas hal itu? Saya pikir itu akan mengirimnya ke publik github repo ketika kita pergi mendapatkannya
hemu

13

Semua hal di atas tidak berhasil untuk saya. Mengkloning repo berfungsi dengan benar tetapi saya masih mendapatkanunrecognized import kesalahan.

Seperti singkatan dari Go v1.13, saya menemukan dalam dokumen bahwa kita harus menggunakan variabel env GOPRIVATE seperti:

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

10

Jika Anda sudah mendapatkan git menggunakan SSH, jawaban ini oleh Ammar Bandukwala adalah solusi sederhana:


$ go getgunakan secara gitinternal. Baris berikut akan dibuat gitdan konsekuensinya$ go get mengkloning paket Anda melalui 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

Itu terlihat seperti masalah GitLab 5769 .

Di GitLab, karena repositori selalu berakhir .git, saya harus menentukan .gitdi akhir nama repositori untuk membuatnya berfungsi, misalnya:

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

Dan:

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

Sepertinya GitHub menyelesaikan ini dengan menambahkan ".git".

Itu seharusnya diselesaikan dalam “ Dukungan tambahan untuk pengambilan repositori Go. # 5958 ", asalkan tag meta yang tepat tersedia .
Meskipun masih ada masalah untuk Go sendiri: " cmd/go: go get tidak dapat menemukan tag meta di dokumen HTML5 ".


Sebenarnya mereka (dan yang lain) telah mendukung meta tag, tetapi itu hanya berfungsi untuk repo publik (di mana go getdapat melihat meta tag tanpa login)
secmask

@secmask itulah sebabnya Anda menggunakan ssh: untuk memberikan kredensial seperti itu.
VonC

oh, itu hanya opsi, saya dapat menggunakan http, https untuk tetapi go getperintah akan terlihat seperti go get gitlab.com/secmask/awserver-go.git.git(akan meminta otentikasi dasar http), yang terlihat tidak baik juga.
secmask

8

Buat token github oauth di sini dan ekspor token github Anda sebagai variabel lingkungan:

export GITHUB_TOKEN=123

Set git config untuk menggunakan url auth dasar:

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

Sekarang Anda dapat go getrepo pribadi Anda.


5

Saya telah membuat ssh-config khusus pengguna, jadi pengguna saya otomatis masuk dengan kredensial dan kunci yang benar.

Pertama saya perlu membuat pasangan kunci

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

dan menyimpannya ke mis ~/.ssh/id_my_domain. Perhatikan bahwa ini juga keypair (pribadi dan publik) yang saya sambungkan ke akun Github saya, jadi akun saya disimpan di~/.ssh/id_github_com .

Saya kemudian telah membuat (atau mengubah) file yang disebut ~/.ssh/configdengan entri:

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

Di server lain, "ssh-url" adalah admin@domain.com:username/private-repo.gitdan entri untuk server ini adalah:

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

Hanya untuk mengklarifikasi bahwa Anda perlu memastikan bahwa User, HostdanHostName diatur dengan benar.

Sekarang saya bisa menjelajah ke jalan masuk dan kemudian go get <package>, misalnya di go get mainmana file tersebut main/main.gomenyertakan paket (dari contoh terakhir di atas) domain.com:username/private-repo.git.


Anda juga dapat mengimpor paket secara langsung dengan: go get hostname.com/username/repo.git(ekstensi .git sangat penting).
Joachim

apakah ada cara untuk melakukannya tanpa ekstensi .gitdan mengapa itu terjadi?
Cristian Chaparro A.

1
Menarik, alasannya karena saya tidak bisa mendapatkan repo, tanpa .gitekstensi itu karena konfigurasi git lokal saya git config --global url."git@gitlab.myserver.com:".insteadOf "https://gitlab.myserver.com/",, tetapi subdomain gitlab.myserver.comtidak memiliki sertifikasi ssl, jadi saya menggunakan httpalih-alih https, sekarang
Cristian Chaparro A.

3

Saya menemukan .netrcdan menemukan itu relevan dengan ini.

Buat file ~/.netrcdengan konten berikut:

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

Selesai!

Selain itu, untuk versi GO terbaru, Anda mungkin perlu menambahkan ini ke variabel lingkungan GOPRIVATE=github.com (saya telah menambahkannya ke saya .zshrc)

netrc juga membuat pengaturan lingkungan pengembangan saya lebih baik karena akses github pribadi saya untuk HTTPS telah dikonfigurasi sekarang untuk digunakan di mesin (seperti konfigurasi SSH saya).

Hasilkan token akses pribadi GitHub: https://github.com/settings/tokens

Jika Anda ingin tetap menggunakan otentikasi SSH, maka sembunyikan permintaan untuk menggunakan ssh dengan paksa

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

Metode lainnya untuk mengatur akses git: https://gist.github.com/technoweenie/1072829#gistcomment-2979908

Lihat halaman manual dan jawaban ini untuk penggunaannya dengan Git di Windows secara khusus


2

Bagi saya, solusi yang ditawarkan oleh orang lain masih memberikan kesalahan berikut selama go get

git@gl.nimi24.com: Izin ditolak (publickey). fatal: Tidak bisa membaca dari repositori jarak jauh. Pastikan Anda memiliki hak akses yang benar dan repositori ada.

Apa solusi ini diperlukan

  1. Seperti yang dinyatakan oleh orang lain:

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

  2. Menghapus frasa sandi dari ./ssh/id_rsakunci saya yang digunakan untuk mengautentikasi koneksi ke repositori. Ini dapat dilakukan dengan memasukkan kata sandi kosong ketika diminta sebagai respons terhadap:

    ssh-keygen -p

Kenapa ini bekerja?

Ini bukan solusi yang cukup bagus karena selalu lebih baik memiliki frasa sandi pada kunci pribadi Anda, tetapi hal itu menyebabkan masalah di suatu tempat di dalam OpenSSH.

go getmenggunakan internal git, yang menggunakan openssh untuk membuka koneksi. OpenSSH mengambil sertifikat yang diperlukan untuk otentikasi .ssh/id_rsa. Ketika mengeksekusi perintah git dari baris perintah, seorang agen dapat membuka file id_rsa untuk Anda sehingga Anda tidak harus menentukan frasa sandi setiap kali, tetapi ketika dieksekusi di dalam perut, dapatkan, ini tidak bekerja di saya. kasus. OpenSSH ingin memberi Anda kata sandi, tetapi karena itu tidak mungkin karena bagaimana namanya, ia mencetak ke log debug-nya:

read_passphrase: tidak bisa membuka / dev / tty: Tidak ada perangkat atau alamat tersebut

Dan gagal. Jika Anda menghapus frasa sandi dari file kunci, OpenSSH akan membuka kunci Anda tanpa prompt itu dan berfungsi

Ini mungkin disebabkan oleh Go mengambil modul secara bersamaan dan membuka beberapa koneksi SSH ke Github secara bersamaan (seperti yang dijelaskan dalam artikel ini ). Ini agak didukung oleh fakta bahwa log debug OpenSSH menunjukkan koneksi awal ke repositori berhasil, tetapi kemudian mencobanya lagi untuk beberapa alasan dan kali ini memilih untuk meminta frasa sandi.

Namun solusi menggunakan multiplexing koneksi SSH sebagaimana dikemukakan dalam artikel yang disebutkan tidak bekerja untuk saya. Sebagai catatan, penulis menyarankan menambahkan collowing conf ke file ssh config untuk host yang terpengaruh:

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

Tetapi seperti yang dinyatakan, bagi saya itu tidak berhasil, mungkin saya salah

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.