3 poin oleh GN⁺ 2024-11-26 | 1 komentar | Bagikan ke WhatsApp
  • Dalam lingkungan yang menaruh repositori pribadi maupun kerja di ~/workspace, membagi identitas Git berdasarkan remote URL lebih akurat daripada berdasarkan lokasi folder
  • includeIf di Git dapat memuat konfigurasi per jalur dengan gitdir, 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/config dengan Host, Hostname, User, dan IdentityFile; bahkan pada github.com yang sama, jika ingin memakai kunci per organisasi, diperlukan alias Host
  • Jika url.<base>.insteadOf juga dikonfigurasi, Anda tetap bisa memakai git@github.com:orgname/project seperti biasa, sementara secara internal URL itu diganti menjadi gh-work:orgname sehingga memakai konfigurasi SSH yang benar

Membagi konfigurasi Git berdasarkan remote URL

  • Contoh includeIf yang umum menyertakan file konfigurasi berbeda berdasarkan jalur direktori lokal, seperti gitdir:~/code/** dan gitdir:~/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, dan user.signingkey
  • Jika semua kode diletakkan di bawah ~/workspace, repositori pribadi, work-1, dan work-2 bisa 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
  • Git menyertakan konfigurasi yang terakhir cocok, jadi urutan kondisi itu penting
    • Kondisi github.com:orgname/** harus berada di bawah kondisi umum github.com:*/** agar konfigurasi khusus organisasi tidak tertimpa oleh konfigurasi GitHub umum
  • Hasilnya, repositori yang memiliki remote github.com:orgname/** memakai config-gh-org, sedangkan repositori GitHub lainnya memakai konfigurasi GitHub umum

Menyesuaikan informasi akses per organisasi dengan kunci SSH dan insteadOf

1 komentar

 
GN⁺ 2024-11-26
Opini Hacker News
  • Alih-alih insteadOf, clone repositori sebagai gh-work:org/repo dan letakkan includeIf "hasconfig:remote.*.url:gh-work:**/**" di konfigurasi Git
    Dengan begitu, repositori yang di-clone memakai identitas SSH yang didefinisikan di bawah gh-work akan otomatis mengambil konfigurasi gh-work.inc, yang berisi hal-hal seperti identitas Git dan kunci penandatanganan seperti konfigurasi SSH
    Pada akhirnya, nama gh-work menjadi pembeda antara identitas SSH dan identitas Git sehingga lebih mudah dipahami

    • Solusi di artikel terasa punya terlalu banyak kebebasan dibanding yang dibutuhkan, jadi agak mengganggu, tetapi ini tampak seperti cara yang elegan untuk mengurangi parameter runtime menjadi satu
    • includeIf peka huruf besar/kecil, dan prioritasnya ditentukan oleh konfigurasi terakhir yang menang
      Untuk memeriksa apakah ini bekerja dengan benar, jalankan git remote get-url origin dan git config --get user.email
    • Pendekatan ini bisa merusak skrip yang mengharapkan URL repositori jarak jauh memiliki bentuk tertentu
  • Menurut saya, cara yang lebih baik adalah menaruh alias per identitas di .gitconfig pada HOME, lalu menjalankan git config-company atau git config-personal saat inisialisasi repositori atau segera setelah clone
    Aktifkan user.useConfigOnly = true, lalu di alias setel user.email, user.name, dan core.sshCommand di repositori lokal untuk masing-masing kunci SSH pribadi/perusahaan

    • Masalahnya adalah bagaimana melakukan clone awal tanpa konfigurasi SSH yang benar sejak awal
      Kelebihan 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

    • Dalam budaya tanpa saling menyalahkan, untuk forensik kontrol versi, yang lebih penting mungkin bukan siapa yang melakukannya melainkan kapan dan di sekitar perubahan apa itu terjadi
      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
    • Percayai itu sejauh Anda mempercayai dokumen atau tanda tangan yang ditulis karyawan
      Jika Anda tidak bisa percaya bahwa karyawan dapat mengidentifikasi commit mereka sendiri dengan benar, menurut saya mereka seharusnya dipecat
    • Kalau mau berbaik sangka, saya penasaran apakah dia tetap memakai kunci penandatanganan yang sama
    • Mengejutkan bahwa dia dibayar untuk keisengan seperti itu
    • Git punya dukungan bawaan untuk memisahkan author dan committer, dan sepertinya dia mungkin hanya mengubah properti author
  • Tidak perlu menyentuh ~/.ssh/config; cukup letakkan core.sshCommand = /usr/bin/ssh -o IdentitiesOnly=yes -i ~/.ssh/IdentityFile2 -a di ~/.gitconfig atau ~/.config/git/personal seperti di artikel
    Ini juga membuat submodul lebih mudah tanpa insteadOf

    • Yang tersisa adalah bagaimana menanganinya jika Anda punya lebih dari satu identitas SSH
  • Saya sudah lama memakai includeIf berbasis direktori(https://www.bobek.cz/til/git-identities/), dan hasconfig:remote ini benar-benar rapi
    Ini juga bekerja saat melakukan clone repositori

  • includeIf cukup bagus
    Saat ini saya menaruh kompleksitas SSH di ~/.ssh dan punya satu include untuk tiap pelanggan/proyek/identitas
    Untuk hal-hal seperti GitHub yang tidak punya nama host unik, saya membuat alias host seperti customer-github, dengan HostName github.com, IdentityFile ~/.ssh/customer_rsa, User git
    Setelah itu, di git clone tinggal pakai alias tersebut

  • Saya 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 pengaturan user.email di programs.git.includes
    Referensi: https://nix-community.github.io/home-manager/options.xhtml#opt-programs.git.includes

    • Ini tampak kurang sederhana daripada menuliskannya langsung di .gitconfig
      Kondisi 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", tetapi hasconfig:remote benar-benar fitur yang mengubah permainan

    • Sulit dipercaya harta karun ini tersembunyi sebagai draft selama 3 tahun
  • Untuk 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

    • “Memakai mesin pribadi untuk bekerja” cakupannya sangat luas
      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 Personal atau $ git su Work, lalu email, nama, kunci SSH, dan secara opsional kunci PGP akan disetel ke .git/config repositori
    Ini sangat menghemat waktu saya