Cara Saya Mengatur Identitas Git
(benji.dog)- Dalam lingkungan yang menaruh repositori pribadi maupun kerja di
~/workspace, membagi identitas Git berdasarkan remote URL lebih akurat daripada berdasarkan lokasi folder includeIfdi Git dapat memuat konfigurasi per jalur dengangitdir, tetapi jika repositori dari beberapa akun bercampur di direktori kerja yang sama, percabangan berbasis jalur akan mencapai batasnya- Dengan memakai kondisi
hasconfig:remote.*.url:, Anda dapat menyertakan file konfigurasi terpisah berdasarkan pola remote URL seperti GitHub, GitLab, SourceHut, atau organisasi GitHub tertentu - Kunci SSH harus dikelola terpisah di
~/.ssh/configdenganHost,Hostname,User, danIdentityFile; bahkan padagithub.comyang sama, jika ingin memakai kunci per organisasi, diperlukan alias Host - Jika
url.<base>.insteadOfjuga dikonfigurasi, Anda tetap bisa memakaigit@github.com:orgname/projectseperti biasa, sementara secara internal URL itu diganti menjadigh-work:orgnamesehingga memakai konfigurasi SSH yang benar
Membagi konfigurasi Git berdasarkan remote URL
- Contoh
includeIfyang umum menyertakan file konfigurasi berbeda berdasarkan jalur direktori lokal, sepertigitdir:~/code/**dangitdir:~/work/**- Di bawah
~/code, Git dapat memuat~/.config/git/personal; di bawah~/work, Git dapat memuat~/.config/git/work - File yang disertakan biasanya berisi identitas Git dan kunci penandatanganan seperti
user.name,user.email, danuser.signingkey
- Di bawah
- Jika semua kode diletakkan di bawah
~/workspace, repositori pribadi,work-1, danwork-2bisa bercampur dalam struktur jalur yang sama, sehingga sulit membuat pemisahan yang diinginkan hanya dengan kondisi berbasis jalur - Dengan
hasconfig:remote.*.url:di Git, file konfigurasi dapat disertakan hanya ketika repositori saat ini memiliki remote URL tertentu- Jika cocok dengan
git@github.com:*/**, gunakan~/.config/git/config-gh - Jika cocok dengan
git@github.com:orgname/**, gunakan~/.config/git/config-gh-org - Jika cocok dengan
git@gitlab.com:*/**, gunakan~/.config/git/config-gl - Jika cocok dengan
git@git.sr.ht:*/**, gunakan~/.config/git/config-srht
- Jika cocok dengan
- Git menyertakan konfigurasi yang terakhir cocok, jadi urutan kondisi itu penting
- Kondisi
github.com:orgname/**harus berada di bawah kondisi umumgithub.com:*/**agar konfigurasi khusus organisasi tidak tertimpa oleh konfigurasi GitHub umum
- Kondisi
- Hasilnya, repositori yang memiliki remote
github.com:orgname/**memakaiconfig-gh-org, sedangkan repositori GitHub lainnya memakai konfigurasi GitHub umum
Menyesuaikan informasi akses per organisasi dengan kunci SSH dan insteadOf
- Terpisah dari identitas Git, untuk melakukan
pull·pushke remote diperlukan konfigurasi kunci SSH- Untuk
gitlab.comdi~/.ssh/config, Anda dapat menetapkanIdentityFileseperti~/.ssh/gitlab.id_ed25519 - Untuk
github.com, Anda dapat menetapkanIdentityFileseperti~/.ssh/github.id_ed25519
- Untuk
- Bergantung pada konfigurasi
ssh-agent, menambahkanIdentitiesOnly yesdi bawahIdentityFileuntuk setiapHostbisa menjadi pilihan yang baik - Jika ingin memakai kunci berbeda per organisasi pada
github.comyang memilikiHostnameyang sama, nilaiHostharus dibuat berbeda- Bentuk konfigurasinya adalah
Host gh-work,Hostname github.com,User git,IdentityFile ~/.ssh/work.id_ed25519
- Bentuk konfigurasinya adalah
- Dengan menggunakan
url "gh-work:orgname"daninsteadOf = git@github.com:orgnamepada konfigurasi Git, URL Git dapat diganti secara otomatis- Pengguna mengetik seperti
git clone git@github.com:orgname/project - Git mengganti bagian
github.com:orgnamemenjadigh-work:orgnamedan menggunakan konfigurasigh-workdi~/.ssh/config
- Pengguna mengetik seperti
- Cara ini adalah trik yang dirujuk dari SSH and multiple Git credentials, dan artikel lain yang turut dijadikan referensi adalah sebagai berikut
1 komentar
Opini Hacker News
Alih-alih
insteadOf, clone repositori sebagaigh-work:org/repodan letakkanincludeIf "hasconfig:remote.*.url:gh-work:**/**"di konfigurasi GitDengan begitu, repositori yang di-clone memakai identitas SSH yang didefinisikan di bawah
gh-workakan otomatis mengambil konfigurasigh-work.inc, yang berisi hal-hal seperti identitas Git dan kunci penandatanganan seperti konfigurasi SSHPada akhirnya, nama
gh-workmenjadi pembeda antara identitas SSH dan identitas Git sehingga lebih mudah dipahamiincludeIfpeka huruf besar/kecil, dan prioritasnya ditentukan oleh konfigurasi terakhir yang menangUntuk memeriksa apakah ini bekerja dengan benar, jalankan
git remote get-url origindangit config --get user.emailMenurut saya, cara yang lebih baik adalah menaruh alias per identitas di
.gitconfigpadaHOME, lalu menjalankangit config-companyataugit config-personalsaat inisialisasi repositori atau segera setelah cloneAktifkan
user.useConfigOnly = true, lalu di alias seteluser.email,user.name, dancore.sshCommanddi repositori lokal untuk masing-masing kunci SSH pribadi/perusahaanKelebihan pendekatan di artikel tampaknya adalah saat clone dari organisasi, semuanya langsung bekerja
Dulu di sebuah startup ada orang yang setiap hari mengganti identitasnya ke nama acak seperti dongeng
Commit hari Senin sebagai Mr. Bunnymann, hari Selasa sebagai Doctor Funtime, jadi sangat merepotkan saat melakukan forensik kontrol versi
Kalau mau berbaik sangka, mungkin dia ingin mengingatkan bahwa siapa pun bisa mengisi konfigurasi identitas dengan nilai apa saja, jadi nilai itu tidak boleh terlalu dipercaya
Meski begitu, mengetahui siapa yang melakukannya tetap membantu jika ingin menanyakan detail atau memperkirakan gaya dan tingkat keahlian
Dengan mewajibkan tanda tangan GPG pada commit dan mendaftarkan identitas GPG yang diizinkan, Anda bisa mengidentifikasi penulis sebenarnya dari tanda tangan alih-alih dari metadata author/committer
Tentu saja, “sederhana” dan tanda tangan GPG tidak selalu cocok bila digabung
Jika Anda tidak bisa percaya bahwa karyawan dapat mengidentifikasi commit mereka sendiri dengan benar, menurut saya mereka seharusnya dipecat
Tidak perlu menyentuh
~/.ssh/config; cukup letakkancore.sshCommand = /usr/bin/ssh -o IdentitiesOnly=yes -i ~/.ssh/IdentityFile2 -adi~/.gitconfigatau~/.config/git/personalseperti di artikelIni juga membuat submodul lebih mudah tanpa
insteadOfSaya sudah lama memakai
includeIfberbasis direktori(https://www.bobek.cz/til/git-identities/), danhasconfig:remoteini benar-benar rapiIni juga bekerja saat melakukan clone repositori
includeIfcukup bagusSaat ini saya menaruh kompleksitas SSH di
~/.sshdan punya satu include untuk tiap pelanggan/proyek/identitasUntuk hal-hal seperti GitHub yang tidak punya nama host unik, saya membuat alias host seperti
customer-github, denganHostName github.com,IdentityFile ~/.ssh/customer_rsa,User gitSetelah itu, di
git clonetinggal pakai alias tersebutSaya punya masalah yang sama, dan sekarang seolah ada solusinya
Jika memakai NixOS dan home-manager di Linux dan Mac, pengaturan ini jadi sederhana
Anda cukup menaruh
condition = "hasconfig:remote.*.url:git@github.com:/**"dan pengaturanuser.emaildiprograms.git.includesReferensi: https://nix-community.github.io/home-manager/options.xhtml#opt-programs.git.includes
.gitconfigKondisi dan pengaturannya sama seperti di artikel, tetapi di sini ditambah tahap build/template dan kebutuhan mempelajari bahasa pemrograman baru dengan sintaks yang tidak biasa
Saya sudah membagi konfigurasi kerja dan pribadi dengan
includeIf: "gitdir", tetapihasconfig:remotebenar-benar fitur yang mengubah permainanUntuk konsultan, saya selalu sangat menyarankan memakai mesin terpisah untuk pekerjaan, atau setidaknya pengguna OS yang terpisah
Memakai mesin pribadi untuk bekerja berisiko membuat Anda mengalami masalah besar
Di perusahaan remote-first, ada yang menyediakan laptop sendiri dan mendapat dana membeli perangkat baru tiap 2–3 tahun tetapi itu tetap laptop pribadi, atau bisa juga kontraktor sementara
Perlu penjelasan yang lebih spesifik tentang situasi apa yang bermasalah dan alasannya
Risikonya memang nyata, tetapi kalau tidak bisa merincinya, itu lebih mirip menyebarkan FUD daripada edukasi
Ini alat yang saya buat untuk mudah mengganti identitas Git per proyek: https://github.com/cquintana92/git-switch-user
Setelah mengatur identitas, jalankan
$ git su Personalatau$ git su Work, lalu email, nama, kunci SSH, dan secara opsional kunci PGP akan disetel ke.git/configrepositoriIni sangat menghemat waktu saya
Alat ini sudah berumur 12 tahun tetapi masih aktif dirawat