git: // protokol diblokir oleh perusahaan, bagaimana saya bisa mengatasinya?

188

Mencoba sesuatu seperti git clone git://github.com/ry/node.gittidak akan berhasil, itu menghasilkan:

Initialized empty Git repository in /home/robert/node/.git/
github.com[0: 207.97.227.239]: errno=Connection timed out
fatal: unable to connect a socket (Connection timed out)

Namun, kloning melalui HTTP berfungsi dengan baik. Sejauh ini saya sudah mengetahui bahwa itu masalah dengan protokol, tapi saya mencoba menginstal cloud9 yang memerlukan perintah

git submodule update --init --recursive

yang mencoba menggunakan protokol git: // dan gagal. Apakah ada cara untuk mengubah cara kerja perintah itu atau sesuatu?

Robert
sumber
apakah Anda memiliki akses SSH? atau hanya HTTP?
Pablo Santa Cruz
56
Ada apa dengan orang yang mencoba untuk menutup pertanyaan git? Menurut FAQ, ruang lingkup SO termasuk "alat perangkat lunak yang biasa digunakan oleh programmer". Ada lebih dari enam ribu pertanyaan git di sini. Mereka berada di sini.
Cascabel
9
Anda bisa membuat Git menggunakan https: // secara otomatis kapan pun ia melihat sebuah git: // URL:git config --global url.https://.insteadOf git://
WildlyInaccurate

Jawaban:

426

Jika ini merupakan masalah dengan firewall Anda yang memblokir port protokol git: (9418), maka Anda harus melakukan perubahan yang lebih gigih sehingga Anda tidak harus ingat untuk mengeluarkan perintah yang disarankan oleh posting lain untuk setiap repo git.

Solusi di bawah ini juga hanya berfungsi untuk submodul yang mungkin juga menggunakan protokol git:.

Karena pesan git tidak benar-benar langsung menunjuk ke port memblokir firewall 9418, mari kita coba untuk mendiagnosis ini sebagai masalah aktual.

Mendiagnosis Masalah

Referensi: https://superuser.com/q/621870/203918 dan https://unix.stackexchange.com/q/11756/57414

Ada beberapa alat yang dapat kita gunakan untuk menentukan apakah firewall menyebabkan masalah kita - gunakan mana saja yang diinstal pada sistem Anda.

# Using nmap
# A state of "filtered" against port 9418 (git) means
#   that traffic is being filtered by a firewall
$ nmap github.com -p http,git

Starting Nmap 5.21 ( http://nmap.org ) at 2015-01-21 10:55 ACDT
Nmap scan report for github.com (192.30.252.131)
Host is up (0.24s latency).
PORT     STATE    SERVICE
80/tcp   open     http
9418/tcp filtered git

# Using Netcat:
# Returns 0 if the git protocol port IS NOT blocked
# Returns 1 if the git protocol port IS blocked
$ nc github.com 9418 < /dev/null; echo $?
1

# Using CURL
# Returns an exit code of (7) if the git protocol port IS blocked
# Returns no output if the git protocol port IS NOT blocked
$ curl  http://github.com:9418
curl: (7) couldn't connect to host

OK, jadi sekarang kita telah menentukan bahwa port git kita diblokir oleh firewall, apa yang bisa kita lakukan? Baca terus :)

Penulisan Ulang URL Dasar

Git menyediakan cara untuk menulis ulang URL menggunakan git config. Cukup terbitkan perintah berikut:

git config --global url."https://".insteadOf git://

Sekarang, seolah-olah dengan sihir, semua perintah git akan melakukan substitusi git://kehttps://

Apa Perubahan yang Dilakukan Perintah Ini?

Lihatlah konfigurasi global Anda menggunakan:

git config --list

Anda akan melihat baris berikut di output:

url.https://.insteadof=git://

Anda dapat melihat bagaimana ini terlihat di file, dengan mengintip di ~/.gitconfigmana Anda sekarang akan melihat bahwa dua baris berikut telah ditambahkan:

[url "https://"]
    insteadOf = git://

Ingin Lebih Banyak Kontrol?

Cukup gunakan URL yang lebih lengkap / spesifik dalam penggantian. Misalnya, untuk hanya memiliki URL GitHub gunakan https: // alih-alih git: //, Anda dapat menggunakan sesuatu seperti:

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

Anda dapat menjalankan perintah ini beberapa kali menggunakan penggantian yang berbeda. Namun, jika URL cocok dengan beberapa penggantian, kecocokan terlama "menang". Hanya satu penggantian yang akan dilakukan per URL.

Perubahan Seluruh Sistem untuk Sysadmin

Jika Anda seorang Sysadmin Linux dan Anda tidak ingin pengguna Anda harus melalui rasa sakit di atas Anda dapat membuat perubahan konfigurasi git cepat seluruh sistem.

Cukup edit atau tambahkan konten berikut ke /etc/gitconfigdan voila pengguna Anda tidak perlu khawatir tentang hal-hal di atas:

[url "https://"]
    insteadOf = git://
Nathan S. Watson-Haigh
sumber
9
Kesederhanaan yang luar biasa!
Lance Hunt
Bagus sekali! Tidak ada lagi pencarian dan penggantian. Buat skrip baru berfungsi sekarang. Jawaban ini menghemat banyak waktu saya. Terima kasih!
Jeremy Bell
7
Untuk sedikit lebih mengontrol URL mana yang akan dikonversi, Anda dapat menentukan bagian dari URL juga. Sebagai contoh: Saya memiliki server internal pribadi 'myserver.lan.example.com' yang meng-host git repos melalui SSH (gitlab) tetapi tidak HTTPS. Oleh karena itu, saya harus menggunakan SSH jika saya ingin memanfaatkan otentikasi kunci yang mudah. Saya juga menggunakan repo dari Github, tetapi firewall perusahaan saya memblokir SSH ke Github. Saya tidak ingin mengganti semua instance 'git: //' dengan 'https: //' karena itu akan merusak gitlab. Solusinya adalah git config --global url."https://github".insteadOf git://github.
clayzermk1
2
Saya menjalankan git dari dalam cygwin dan satu-satunya cara agar ini bisa berfungsi adalah dengan melakukan 'Perubahan Sistem Secara Luas untuk Sysadmin' dan menambahkan perubahan 'url.https: //.insteadof=git: //' ke file 'C: \ Program Files (x86) \ Git \ etc \ gitconfig'. Terima kasih atas petunjuknya!
Craig
3
Untuk membatalkan perubahan ini, seseorang dapat menggunakangit config --global --unset url."https://".insteadOf
djskinner
29

Github juga menyediakan akses http, yang kecil kemungkinannya diblokir oleh perusahaan Anda. Untuk memberi tahu submodule untuk menggunakannya, Anda dapat melakukan ini:

git submodule init
git config submodule.<name>.url https://github.com/...
git submodule update

Inilah sebenarnya mengapa init dan pembaruan adalah perintah yang terpisah - Anda dapat init, menyesuaikan lokasi, lalu memperbarui. update --inithanyalah jalan pintas ketika Anda tidak perlu menyesuaikan URL apa pun.

Untuk siapa pun yang kebetulan melakukan hal ini, tentu saja Anda juga dapat menggunakan URL ssh (jika perusahaan Anda memblokir git: // tetapi tidak ssh), tetapi dalam hal ini OP mungkin tidak memiliki akses SSH ke repo jarak jauh.

Cascabel
sumber
Kedengarannya seperti ini mungkin akan bekerja untuk saya, meskipun sepertinya saya harus melalui masing-masing secara individual. Sedang melakukan github.com/ajaxorg/cloud9 khusus jika itu penting.
Robert
4
@ Robert: Jika ada banyak, Anda bisa mengedit file konfigurasi secara langsung dan melakukan pencarian dan mengganti: sed -i 's@git://github@https://github@' .git/config.
Cascabel
Hmm, untuk beberapa alasan mereka mengatakan http: // dalam file, tetapi perintah masih mencoba git: //
Robert
1
Saya mengalami masalah yang sama yang dijelaskan dalam OP, tetapi ketika saya menggunakan solusi ini, masih gagal, tetapi dengan kesalahan yang sedikit berbeda. Dikatakan "kesalahan: saat mengakses https: // ... fatal: permintaan HTTP gagal" Apakah ada yang punya wawasan tentang ini? Apakah Host saya memblokir sesuatu? Pembaruan submodules saya yang lain baik-baik saja, saya hanya mengalami masalah dengan satu.
Jo Sprague
13

Opsi lain yang tidak melibatkan menyentuh konfigurasi git adalah mengubah pengaturan ssh untuk menggunakan port 443 alih-alih port 22 biasa.

Referensi: Menggunakan SSH melalui port HTTPS

Dari artikel itu:

edit the file at ~/.ssh/config, and add this section:

Host github.com
   Hostname ssh.github.com   
   Port 443

Setelah itu, saya berhasil melakukan push to Github. Di rumah Anda dapat mengubah kembali ssh config ke cara itu jika Anda mau.

elpddev
sumber
7

Saya juga mengalami masalah yang sama untuk sementara waktu. Kemudian saya mencoba mengubah git config menggunakan perintah yang disarankan:

git config --global url."https://".insteadOf git://

yang sayangnya tidak melakukan trik untuk saya . Saya masih mengalami masalah yang sama!

Apa yang sebenarnya memecahkan masalah saya akhirnya adalah, saya telah mengatur ulang url jarak jauh dari repositori saya lagi menggunakan perintah berikut:

git remote set-url origin https://github.com/<my_user_name>/<my_repo_name>.git

yang sebelumnya seperti ini:

git remote set-url origin [email protected]:<my_user_name>/<my_repo_name>.git

Setelah mengatur url jauh menggunakan https://bukan [email protected]masalah diselesaikan untuk saya.

KM Rakibul Islam
sumber
1
Saya mengalami masalah serupa. Tampaknya menetapkan global hanya memengaruhi repo yang dikloning ke depan, dan tidak berubah secara surut.
Taylor Edmiston
2

Memperluas jawaban Nathan di atas, Anda juga dapat mencoba protokol ssh jika firewall perusahaan Anda mengganggu https. Dalam kasus saya, firewall memblokir protokol git, menerbitkan kembali sertifikat ssl untuk https dan ini melanggar bower untuk saya, bahkan dengan opsi ketat-ssl dimatikan. Anda dapat melakukan penulisan ulang url yang serupa untuk ssh, dan membuat kunci / pasangan ssh seperti yang dijelaskan pada github .

 git config --global url."ssh://[email protected]".insteadOf git://github.com

Anda juga harus mengaktifkan ssh-agent untuk menginstal git Anda.

jhiller
sumber
1

itu karena alamat GIT untuk server simpul telah berubah, Anda harus masuk sekarang:

git clone https://github.com/joyent/node

semoga berhasil

fmo
sumber
6
Pertanyaan ini dari Februari, ketika di atas adalah URL yang valid.
Robert
@calccrypto tautan adalah bagian dari perintah yang tidak ditandai kode, ini tidak dimaksudkan sebagai tautan ke informasi.
Mike Precup
0

pengantar

Saya akan menambahkan di sini pendekatan saya sendiri ( yang tidak diperlukan jika Anda memiliki repositori git yang dapat diakses publik yang mendukung https ).

Saya bekerja di sebuah perusahaan di mana repositori git hanya dapat diakses dari dalam perusahaan. Tapi saya juga bekerja dari rumah.

Bagaimana cara mendorong ke repositori perusahaan dari rumah?

Saya telah membuat repositori dengan folder di google drive saya. Kecuali untuk git, dan https, Anda dapat memasukkan repositori sebagai path.

masukkan deskripsi gambar di sini

Jadi, alih-alih mendorong ke asal, saya mendorong ke "gDrive". Ini menyebabkan folder untuk disinkronkan dari workstation rumah saya ke google drive, dan kemudian komputer kerja saya menarik perubahan. Selain itu, karena terkadang file dalam direktori ".git" tidak selaras, saya mengganti nama folder untuk sementara dari mis. "Trunk" menjadi "trunk2". Ini memaksa komputer di rumah dan di kantor untuk 100% disinkronkan dengan google drive.

Saya kemudian masuk ke komputer kerja saya baik melalui remote checkpoint-vpn (atau teamviewer) dan mendorong pembaruan saya ke repositori work git.

Selain itu, proses akan bekerja sebaliknya untuk mendorong ke repositori git di luar perusahaan yang diblokir.

  1. Dorong dari workstation git repo ke folder di google drive.
  2. Paksa sinkronisasi 100% dengan mengganti nama sementara direktori proyek di gDrive.
  3. Akses komputer di rumah melalui semacam perubahan jarak jauh dan tekan.
Menios
sumber