git clone - gagal alih-alih meminta kredensial

14

Ketika mengkloning repositori git dalam alat otomatis - ujung depan web, sistem CI, kadang-kadang doa klon git membuka prompt yang menanyakan nama pengguna dan kata sandi (misalnya, ketika mengkloning repo Github yang tidak ada atau pada simpul baru yang hilang kunci ssh ).

Bagaimana cara membuat git gagal (sebaiknya dengan pesan kesalahan yang masuk akal dan kode keluar) alih-alih menunggu proses server untuk memberikannya nama pengguna dan kata sandi?

Tinrtkovic
sumber
Kami memiliki Jenkins multi-server yang diatur, yang duduk menunggu prompt sampai mati jika dijalankan pada server baru yang kehilangan kunci ssh - cara untuk mengonfigurasinya hanya akan gagal dengan pesan dan kode keluar bukan nol akan menjadi berguna.
Danny Staple
Jika menangkap semua "batch" mode dapat digunakan untuk melarang meminta kunci host juga - ini akan ideal.
Danny Staple
Keduanya terkait - mencoba menyatukannya - serverfault.com/questions/61915/… , stackoverflow.com/questions/7772190/… .
Danny Staple

Jawaban:

15

Di git versi 2.3 ada variabel lingkungan GIT_TERMINAL_PROMPTyang ketika disetel ke 0akan menonaktifkan meminta kredensial.

Anda bisa mendapatkan lebih banyak info tentang itu di man git(setelah memperbarui ke versi git 2.3) atau di posting blog ini di github .

Contoh:

  • git clone https://github.com/some/non-existing-repo akan meminta nama pengguna & kata sandi
  • GIT_TERMINAL_PROMPT=0 git clone https://github.com/some/non-existing-repo akan gagal tanpa meminta nama pengguna & kata sandi

sumber
Frustasi untuk kembali ke sini dengan klon git https, pada server el7 dengan git 1.8. Akan memeriksa apakah memperbarui ke 2.0 dari repo lain adalah pilihan untuk itu.
Danny Staple
0

Jika Anda menggunakan otentikasi ssh, dan di linux, maka Anda dapat membuat penggantian perintah ssh untuk menonaktifkan ini.

Buat file bernama "sshnoprompt.sh" dengan:

ssh -oBatchMode=yes $@

Jadikan file ini dapat dieksekusi dengan chmod +x sshnoprompt.sh

Lalu ketika memulai git:

GIT_SSH="sshnoprompt.sh" git clone foo@dummyserver:not_a_repo

Dan itu tidak akan membolehkan git interaktif bertanya atau pertanyaan - seharusnya tidak dapat meminta pengguna untuk apa pun.

Danny Staple
sumber
0

Bekerja dari git versi 1.8.3.1;

git clone -c core.askPass $echo url/or/path/to/git/repo

Konfigurasi core.askPassberfungsi dengan meneruskan kontrol penanganan kredensial ke program yang disebutkan di atas. Namun karena $echotidak bisa melakukan apa pun kecuali output, upaya klon segera gagal dan pengalihan bash masing-masing berlaku. Kode ini hanya dipanggil jika repositori git terjadi secara pribadi, dan akan mem-pipe output kesalahan yang menyatakan bahwa otentikasi gagal untuk repositori tertentu. Anda dapat menguji ini terhadap https://github.com/git/gitrepositori publik dengan repositori pribadi yang Anda ketahui.

Untuk mempermanis kesepakatan, Anda bahkan tidak perlu referensi program seperti echodi tempat pertama. Melewati konfigurasi git -c core.askPasstanpa input berikut masih akan menyebabkan kegagalan jika repositori terjadi secara pribadi karena kode tidak akan tahu program apa yang akan membongkar penanganan kredensial. Walaupun ini jelas merupakan metode yang lebih tua dan lebih sederhana daripada yang lain yang disebutkan di sini, saya tidak tahu apakah itu akan memiliki efek yang sama pada versi git yang lebih lama.

Jouster500
sumber
Anda agak benar tetapi sangat salah. Pertama-tama, dalam kasus Anda $echoadalah referensi variabel yang (tidak disetel) diperluas ke string kosong, jadi itu sama sekali tidak berarti. Jika Anda menaruh echodi sana (tanpa tanda dolar), itu juga akan salah karena itu akan ditafsirkan sebagai lokasi repositori. Pasti begitu -c core.askPass=echo.
Michał Górny
-1

Bergantung pada bagaimana Anda menjalankan git, mengalihkan stdin atau stdout sehingga mereka tidak terhubung ke terminal akan menghentikan git dari meminta rincian dan hanya menyebabkan kesalahan.

Ini juga akan memungkinkan Anda untuk memunculkan kesalahan (atau setidaknya log) ke layanan web.

Matthew Steeples
sumber
Bagaimana tepatnya saya bisa melakukan ini? Berusaha menyelesaikan ini di Bash dulu, keduanya </dev/nulldan nohup .. &sepertinya tidak berhasil.
Tin Tvrtković
Jawaban ini tidak membantu tanpa contoh spesifik bagaimana mencapainya. Terutama bahwa metode 'jelas' tidak berfungsi, seperti yang disebutkan di atas.
Michał Górny
@ MichałGórny Saya belum melihat pertanyaan OPs beberapa tahun yang lalu, tetapi tidak ada informasi yang cukup dalam pertanyaan (OS, Toolset) untuk dapat menjawabnya. Mengarahkan stdin dan stdout. Git telah banyak berubah sejak pertanyaan diajukan (pada Windows misalnya, muncul dialog eksternal untuk kredensial jika Anda terhubung ke Azure DevOps) sehingga Anda lebih baik menggunakan variabel lingkungan yang tercantum dalam jawaban teratas
Matthew Steeples