Banyak tempat kerja dan kampus mengarahkan seluruh koneksi internet melalui sebuah proxy — perantara yang menyaring dan mencatat lalu lintas jaringan. Di lingkungan semacam itu, git clone atau git fetch ke GitHub yang tadinya mulus mendadak gagal karena Git tidak otomatis tahu harus lewat pintu mana. Git punya pengaturan proxy sendiri melalui kunci http.proxy dan https.proxy, lengkap dengan kemampuan memasang proxy berbeda untuk alamat tertentu. Chapter ini menyusun pengaturan tersebut di sandbox dengan alamat fiktif, membaca dan menghapusnya kembali, lalu memperkenalkan alat debug bawaan untuk membedakan masalah proxy dari masalah lain.
Mengatur Proxy Global #
Dua kunci berikut mengarahkan seluruh operasi HTTP dan HTTPS Git ke satu proxy:
git config --global http.proxy "http://proxy.example.com:8080"
git config --global https.proxy "http://proxy.example.com:8080"Alamat proxy.example.com pada materi ini adalah contoh fiktif — ganti dengan alamat proxy yang berlaku di jaringan kita, lengkap dengan portnya. Format nilainya mengikuti pola [protokol://][pengguna[:kata-sandi]@]host[:port], jadi proxy yang butuh identitas ditulis misalnya http://[email protected]:8080 — Git akan meminta kata sandi lewat mekanisme kredensial yang sama dengan remote HTTPS, sehingga kata sandi tidak perlu dituliskan mentah-mentah. Hasil kedua perintah di atas di ~/.gitconfig:
[user]
email = [email protected]
[alias]
lg = log --oneline --graph
proyek = !git -C ~/proyek-utama status -sb
[http]
proxy = http://proxy.example.com:8080
[https]
proxy = http://proxy.example.com:8080Section [user] dan [alias] pada berkas di atas adalah pengaturan dari chapter sebelumnya — ~/.gitconfig memang menampung semuanya. Nilainya terbaca kembali dengan pola standar:
git config --global http.proxyOutput yang Dihasilkan:
http://proxy.example.com:8080Sebagai catatan: http.proxy menimpa proxy yang biasanya sudah diatur lewat variabel lingkungan http_proxy, https_proxy, dan all_proxy — Git membaca variabel tersebut bila kuncinya tidak diatur, dan kunci http.proxy selalu lebih dulu dipakai.
Proxy untuk URL Tertentu #
Sering kali aturannya tidak seragam: seluruh internet lewat proxy kampus, tetapi server Git internal perusahaan boleh ditembus langsung. Untuk itu Git mengenal kunci dengan lingkup per-URL — http.<url>.<kunci>:
git config --global "http.https://perusahaan.example.com.proxy" "http://proxy-kantor.example.com:3128"Kunci tersebut perlu kutip karena memuat spasi dan karakter khusus. Di berkas konfigurasi, URL menjadi nama subsection di dalam section [http]:
[http "https://perusahaan.example.com"]
proxy = http://proxy-kantor.example.com:3128Maknanya: untuk URL yang dimulai dengan https://perusahaan.example.com, Git memakai proxy proxy-kantor.example.com port 3128; URL lain tetap mengikuti proxy global. Pola pencocokannya memilih kunci yang paling spesifik terhadap URL yang sedang diakses, dan kunci global menjadi nilai cadangan. Kedua jalur ini bisa kita periksa sekaligus dengan --get-urlmatch:
git config --get-urlmatch http https://perusahaan.example.com
git config --get-urlmatch http https://lain.example.comOutput yang Dihasilkan:
http.proxy http://proxy-kantor.example.com:3128
http.proxy http://proxy.example.com:8080Baris pertama membuktikan proxy khusus dipakai untuk URL perusahaan; baris kedua jatuh kembali ke proxy global untuk URL lain.
Membaca dan Menghapus Pengaturan Proxy #
Seluruh kunci proxy yang terpasang bisa didaftar dengan --get-regexp:
git config --global --get-regexp 'proxy'Output yang Dihasilkan:
http.proxy http://proxy.example.com:8080
https.proxy http://proxy.example.com:8080
http.https://perusahaan.example.com.proxy http://proxy-kantor.example.com:3128Penghapusannya memakai --unset — kunci per-URL ditulis lengkap dengan kutip, sama seperti saat dipasang:
git config --global --unset "http.https://perusahaan.example.com.proxy"
git config --global --unset http.proxy
git config --global --unset https.proxySetelah ketiganya dihapus, --get-regexp 'proxy' kembali tanpa keluaran dengan kode status 1 — perilaku standar kunci yang tidak ditemukan, persis seperti yang kita ukur di chapter git config
.
Debug Koneksi dengan GIT_CURL_VERBOSE #
Bila koneksi tetap gagal, kita perlu melihat apa yang sebenarnya terjadi di lapisan jaringan. Variabel GIT_CURL_VERBOSE=1 memerintahkan Git mencurahkan seluruh dialog HTTP-nya ke layar. Kita uji dengan git ls-remote — perintah ringan yang hanya membaca daftar referensi tanpa mengunduh repository:
GIT_CURL_VERBOSE=1 git ls-remote https://github.com/git/git.git HEADOutput yang Dihasilkan:
05:01:57.139821 http.c:913 == Info: Couldn't find host github.com in the .netrc file; using defaults
05:01:57.142371 http.c:913 == Info: Host github.com:443 was resolved.
05:01:57.142392 http.c:913 == Info: IPv4: 20.205.243.166
05:01:57.142413 http.c:913 == Info: Trying 20.205.243.166:443...
05:01:57.214144 http.c:913 == Info: Connected to github.com (20.205.243.166) port 443
05:01:57.214212 http.c:872 => Send header: GET /git/git.git/info/refs?service=git-upload-pack HTTP/2
05:01:57.214216 http.c:872 => Send header: User-Agent: git/2.47.3
05:01:57.486687 http.c:872 <= Recv header: HTTP/2 200
(dipotong — total keluaran 127 baris)
6de20f6092dcf9bdb1c8efe03db4b70c82b423dd HEADKeluaran di atas adalah koneksi langsung tanpa proxy — koneksi berhasil, seperti baris Connected to github.com dan tanggapan HTTP/2 200, lalu ls-remote menutup dengan identitas HEAD milik repository tersebut. Waktu pada awal tiap baris adalah penanda waktu pencatatan; identitas HEAD berubah seiring repository sumber berkembang. Inilah bacaan yang perlu dibandingkan saat proxy aktif: baris Trying dan Connected to tidak lagi menunjuk alamat tujuan, melainkan alamat proxy, karena tugas menyambung ke server sebenarnya berpindah ke proxy — curl membuat terowongan ke tujuan lewat proxy, dan kegagalan terowongan itulah yang menandakan alamat proxy, port, atau autentikasinya keliru. Karena mesin uji tidak berada di balik proxy, kita tidak bisa menyalin keluaran versi proxy di sini — namun pola membacanya sama persis.
Proxy SOCKS #
Proxy berprotokol SOCKS ditulis dengan awalan skemanya, misalnya socks5://proxy.example.com:1080, dan ditempatkan pada kunci yang sama:
git config --global http.proxy "socks5://[email protected]:1080"SOCKS kerap dipakai untuk terowongan SSH atau jaringan kampus tertentu; dukungannya diwarisi dari curl yang dipakai Git, jadi format selain socks5:// seperti socks5h:// — yang menyerahkan resolusi nama domain ke proxy — juga dikenali. Daftar lengkap opsi jaringan Git, termasuk pengaturan per-remote remote.<nama>.proxy, terdokumentasi pada dokumentasi resmi git config
.
Seluruh pengaturan section ini — identitas, editor, branch bawaan, alias, hingga proxy — pada akhirnya hanyalah baris-baris teks di beberapa berkas konfigurasi. Chapter penutup section ini membedah isi berkas-berkas tersebut: formatnya, cara memecahnya, dan cara menelusuri dari mana setiap nilai datang.