Bagaimana cara saya memberikan nama pengguna dan kata sandi saat menjalankan "git clone [email protected]"?

846

Saya tahu cara memberikan nama pengguna dan kata sandi untuk permintaan HTTPS seperti ini:

git clone https://username:password@remote

Tapi saya ingin tahu cara memberikan nama pengguna dan kata sandi ke remote seperti ini:

git clone [email protected]

Saya sudah mencoba seperti ini:

git clone username:password@[email protected]
git clone git@username:[email protected]
git clone [email protected]@username:password

Tetapi mereka belum bekerja.

koordinat
sumber
4
Kamu tidak bisa "Git" sebelum "@" sudah menjadi nama pengguna. Dari mana Anda mendapatkan URL repositori ([email protected])? Dari mana Anda mendapatkan gagasan bahwa Anda harus memberikan nama pengguna dan kata sandi yang berbeda?
Ken Thomases
3
URL repos saya berasal dari heroku "[email protected]: zxy-helloworld.git". Dan saya menggunakan shell emacs untuk mengkloning dan mendorong. Jika shell meminta kata sandi, emacs akan hang. Ini adalah masalah yang diketahui dengan emacs di Windows: gnu.org/software/emacs/windows/…
koordinasikan
Bagaimana jika nama pengguna adalah email? bagaimana Anda mengetiknya? myemail @ gmail.com @ example.com ?
Kyon Perez

Jawaban:

1318

Berdasarkan komentar Michael Scharf:

Anda dapat meninggalkan kata sandi sehingga tidak akan masuk dalam file riwayat Bash Anda:

git clone https://[email protected]/username/repository.git

Ini akan menanyakan kata sandi Anda.

Atau, Anda dapat menggunakan:

git clone https://username:[email protected]/username/repository.git

Cara ini bekerja untuk saya dari repositori GitHub.

Bassetassen
sumber
5
Ngomong-ngomong, tidak harus sama. Jika kolega Anda membuat git repo dan Anda masuk sebagai akun lain, mereka tidak akan sama.
holgac
49
Tidak disarankan untuk meletakkan kata sandi di URL karena file ini disimpan di .git / config. Tidak aman, lebih baik menggunakan kunci ssh
zetanova
55
@ MrDuk tidak ada masalah, lepas saja (seperti% 40 iirc).
Benjamin Gruenbaum
57
Anda dapat meninggalkan password: git clone https://[email protected]/username/repository.git. git akan bertanya kepada Anda dan itu tidak akan disimpan dalam git / config atau dalam sejarah bash Anda
Michael_Scharf
37
Anda juga dapat mengetikkan 'spasi' di awal baris sehingga linux tidak akan menyimpan perintah dalam sejarah
Nicolas Zozol
213

The user@host:path/to/repoFormat memberitahu Git untuk penggunaan ssh untuk login ke hostdengan nama pengguna user. Dari git help clone:

Sintaks seperti scp-like juga dapat digunakan dengan protokol ssh:

[user@]host.xz:path/to/repo.git/

Bagian sebelum @adalah nama pengguna, dan metode otentikasi (kata sandi, kunci publik, dll.) Ditentukan oleh ssh, bukan Git. Git tidak memiliki cara untuk mengirimkan kata sandi ke ssh, karena ssh bahkan mungkin tidak menggunakan kata sandi tergantung pada konfigurasi server jarak jauh.

Gunakan ssh-agentuntuk menghindari mengetik kata sandi sepanjang waktu

Jika Anda tidak ingin mengetikkan kata sandi ssh setiap saat, solusinya adalah membuat pasangan kunci publik / pribadi , memasukkan kunci publik ke ~/.ssh/authorized_keysfile Anda di server jarak jauh, dan memuat kunci privat Anda ke dalamnya ssh-agent. Juga lihat Konfigurasi Git lebih SSH untuk login sekali , halaman bantuan GitHub pada passphrase kunci ssh , gitolite dokumentasi ssh , dan kunci ssh Heroku dokumentasi .

Memilih antara beberapa akun di GitHub (atau Heroku atau ...)

Jika Anda memiliki beberapa akun di tempat seperti GitHub atau Heroku, Anda akan memiliki beberapa kunci ssh (setidaknya satu per akun). Untuk memilih akun yang ingin Anda masuki, Anda harus memberi tahu ssh kunci pribadi mana yang akan digunakan .

Misalnya, anggap Anda memiliki dua akun GitHub: foodan bar. Kunci ssh Anda untuk foois ~/.ssh/foo_github_iddan kunci ssh Anda untuk baris ~/.ssh/bar_github_id. Anda ingin mengakses [email protected]:foo/foo.gitdengan fooakun Anda dan [email protected]:bar/bar.gitdengan barakun Anda . Anda akan menambahkan yang berikut ini ke ~/.ssh/config:

Host gh-foo
    Hostname github.com
    User git
    IdentityFile ~/.ssh/foo_github_id
Host gh-bar
    Hostname github.com
    User git
    IdentityFile ~/.ssh/bar_github_id

Anda kemudian akan mengkloning dua repositori sebagai berikut:

git clone gh-foo:foo/foo.git  # logs in with account foo
git clone gh-bar:bar/bar.git  # logs in with account bar

Menghindari ssh sama sekali

Beberapa layanan menyediakan akses HTTP sebagai alternatif untuk ssh:

PERINGATAN : Menambahkan kata sandi Anda ke URL klon akan menyebabkan Git menyimpan kata sandi plaintext Anda .git/config. Untuk menyimpan kata sandi Anda dengan aman saat menggunakan HTTP, gunakan bantuan kredensial. Sebagai contoh:

git config --global credential.helper cache
git config --global credential.https://github.com.username foo
git clone https://github.com/foo/repository.git

Hal di atas akan menyebabkan Git meminta kata sandi Anda setiap 15 menit sekali (secara default). Lihat git help credentialsdetailnya.

Richard Hansen
sumber
Ini adalah penjelasan terbaik tentang cara kerja git dengan SSH. Pemahaman saya adalah bahwa ketika Anda menentukan [email protected]: path / to / repo.git, ia secara efektif memberi tahu git bahwa pengguna itu git sendiri dan bahwa ia harus mengambil kredensial Anda (kunci publik) dari ssh-agent untuk Tuan rumah "githost.com".
Anael
39

Dalam komentar jawaban @ Bassetassen , @plosco menyebutkan bahwa Anda dapat menggunakannya git clone https://<token>@github.com/username/repository.gituntuk mengkloning dari GitHub. Saya pikir saya akan memperluas cara melakukan itu, kalau-kalau ada yang menemukan jawaban ini seperti yang saya lakukan ketika mencoba untuk mengotomatisasi beberapa kloning.

GitHub memiliki panduan yang sangat berguna tentang cara melakukan ini, tetapi tidak mencakup apa yang harus dilakukan jika Anda ingin memasukkan semuanya dalam satu baris untuk keperluan otomatisasi. Ini memperingatkan bahwa menambahkan token ke URL klon akan menyimpannya dalam plaintext di .git/config . Ini jelas merupakan risiko keamanan untuk hampir setiap kasus penggunaan, tetapi karena saya berencana menghapus repo dan mencabut token ketika saya selesai, saya tidak peduli.

1. Buat Token

GitHub memiliki seluruh panduan di sini tentang cara mendapatkan token, tapi di sini TL; DR.

  1. Buka Pengaturan> Pengaturan Pengembang> Token Akses Pribadi ( inilah tautan langsung )
  2. Klik "Hasilkan Token Baru" dan masukkan kata sandi Anda lagi. ( ada tautan langsung lain )
  3. Tetapkan deskripsi / nama untuk itu, periksa izin "repo" dan tekan tombol "Hasilkan token" di bagian bawah halaman.
  4. Salin token baru Anda sebelum Anda meninggalkan halaman

2. Mengkloning Repo

Sama seperti perintah yang diberikan @plosco git clone https://<token>@github.com/<username>/<repository>.git, ganti saja <token>, <username>dan <repository>dengan info apa pun Anda.

Jika Anda ingin mengkloningnya ke folder tertentu, cukup masukkan alamat folder di akhir seperti ini:, di git clone https://<token>@github.com/<username>/<repository.git> <folder>mana <folder>, Anda dapat menebaknya, folder yang ingin dikloning! Anda tentu saja dapat menggunakan ., .., ~, dll di sini seperti Anda dapat di tempat lain.

3. Tanpa Jejak

Mungkin tidak semua ini diperlukan, tergantung pada seberapa sensitif apa yang Anda lakukan.

  • Anda mungkin tidak ingin membiarkan token itu berkeliaran jika Anda tidak memiliki niat untuk menggunakannya selama beberapa waktu, jadi kembali ke halaman token dan tekan tombol hapus di sebelahnya.
  • Jika Anda tidak membutuhkan repo lagi, hapus itu rm -rf <folder>.
  • Jika perlu repo lagi, tetapi tidak perlu mengotomatiskannya lagi, Anda dapat menghapus remote dengan melakukan git remote remove originatau hanya menghapus token dengan menjalankan git remote set-url origin https://github.com/<username>/<repository.git>.
  • Hapus riwayat bash Anda untuk memastikan token tidak tetap masuk di sana. Ada banyak cara untuk melakukan ini, lihat pertanyaan ini dan pertanyaan ini . Namun, mungkin lebih mudah untuk hanya menambahkan semua perintah di atas dengan spasi untuk mencegahnya disimpan.

Perhatikan bahwa saya bukan pro, jadi di atas mungkin tidak aman dalam arti bahwa tidak ada jejak yang tersisa untuk segala jenis pekerjaan forensik.

Rob Rose
sumber
1
https://<token>@github.comtidak diterima dengan portal saya, saya harus menggunakanhttps://oauth2:<token>@github.com
MushyPeas
25

Meskipun ada banyak jawaban, saya sendiri menghadapi masalah berulang ketika nama pengguna atau kata sandi memiliki karakter khusus di dalamnya.

URL menyandikan nama pengguna dan kata sandi Anda untuk git, kemudian menggunakannya sebagai bagian dari URL itu sendiri (ketika tidak ada masalah keamanan).

Katakanlah, URL menyandikan nilai nama pengguna

'pengguna + 1' adalah pengguna% 2B1

dan URL nilai sandi yang disandikan

'Welcome @ 1234' is Welcome% 401234

Maka URL GIT Clone Anda akan terlihat seperti,

git clone https://user%2B1:Welcome%401234@actual-git-url-for-the-repo bekerja dengan baik, sedangkan,

git clone https: // user + 1: Welcome @ 1234 @ actual-git-url-for-the-repo memberi Anda 403 kesalahan

Semoga ini membantu.

Untuk berjaga-jaga, ingin URL menyandikan online: https://www.urlencoder.org/

Santosh Kumar Arjunan
sumber
13

Saya memecahkan masalah ini dengan cara berikut:

masukkan deskripsi gambar di sini

BehrouzMoslem
sumber
11
tidak pernah merupakan ide bagus untuk mengetik kata sandi Anda di baris perintah. Tahukah Anda bahwa sistem Anda dapat menyimpan riwayat baris perintah dalam file? (Ex: Linux memiliki file tersembunyi bernama Bash_history)
augusto
Benar. Setiap kali saya melakukan ini, atau sesuatu seperti ini, yang kadang-kadang bisa sangat nyaman, saya selalu menghapus perintah yang saya gunakan dari sejarah (history -d).
Francesco Marchetti-Stasi
4
@ FrancescoMarchetti-Stasi Anda tidak perlu menghapus perintah, cukup gunakan spasi di awal perintah dan itu tidak akan pernah disimpan dalam sejarah.
Ishtiyaq Husain
Ya - Saya mempelajarinya hanya beberapa bulan yang lalu, setelah hampir 30 tahun menggunakan sistem Unix ... memalukan bagi saya :)
Francesco Marchetti-Stasi
9

Di Windows , langkah-langkah berikut akan memicu kembali jendela masuk GitHub saat git cloneing:

  • Cari menu mulai untuk "Manajer Kredensial"
  • Pilih "Kredensial Windows"
  • Hapus kredensial yang terkait dengan Git atau GitHub

hasil

Ore4444
sumber
5
git config --global core.askpass

Jalankan ini dulu sebelum kloning dengan cara yang sama, harus diperbaiki!

Rohan
sumber
3
Mencoba yang itu, masih tidak memintanya.
Maarten Kieft
Pengaturan konfigurasi global tidak pernah merupakan ide yang baik karena dapat mengacaukan klon lain.
Martin
1

Ini adalah pertanyaan Stack Overflow yang sangat baik, dan jawabannya sangat instruktif, sehingga saya bisa menyelesaikan masalah yang menjengkelkan yang saya temui baru-baru ini.

Organisasi tempat saya bekerja menggunakan Atlassian's BitBucketproduk (bukan Github), pada dasarnya versi GitHub mereka sehingga repositori dapat diamankan sepenuhnya di lokasi. Saya mengalami masalah yang sama dengan @coordinate, karena kata sandi saya diperlukan untuk repositori baru yang saya periksa. Kredensial saya telah disimpan secara global untuk semua BitBucketproyek, jadi saya tidak yakin apa yang menyebabkan hilangnya kredensial.

Singkatnya, saya dapat memasukkan perintah GIT berikut ( hanya menyediakan nama pengguna saya), yang kemudian meminta Manajer Kredensial Git untuk meminta saya memasukkan kata sandi, yang kemudian dapat saya simpan.

git clone https://[email protected]/git/[organization]/[team]/[repository.git]

CATATAN: sub-jalur direktori yang dikurung hanya merujuk ke referensi internal, dan akan berbeda untuk Anda!

Michael M.
sumber
0

Jika Anda menggunakan http/httpsdan Anda ingin MEMENUHI proses tersebut sepenuhnya tanpa memerlukan input pengguna atau prompt pengguna sama sekali (misalnya: di dalam pipa CI / CD), Anda dapat menggunakan pendekatan berikut untuk meningkatkangit credential.helper

GIT_CREDS_PATH="/my/random/path/to/a/git/creds/file"
# Or you may choose to not specify GIT_CREDS_PATH at all.
# See https://git-scm.com/docs/git-credential-store#FILES for the defaults used

git config --global credential.helper "store --file ${GIT_CREDS_PATH}"
echo "https://alice:${ALICE_GITHUB_PASSWORD}@github.com" > ${GIT_CREDS_PATH}

di mana Anda dapat memilih untuk mengatur ALICE_GITHUB_PASSWORDvariabel lingkungan dari perintah shell sebelumnya atau dari konfigurasi pipeline Anda dll.

Ingat bahwa "store" berbasis git-credential-helper menyimpan kata sandi & nilai dalam teks biasa. Jadi pastikan token / kata sandi Anda memiliki izin yang sangat terbatas.


Sekarang hanya menggunakan https: //[email protected]/my_repo.git mana pun sistem otomatis Anda perlu untuk mengambil repo - itu akan menggunakan mandat untuk alicedi github.comsebagai toko oleh git-credential-helper.

Rakib
sumber