Git kimliği ayarlarımı nasıl yönetiyorum
(benji.dog)- Hem kişisel hem de iş depolarını
~/workspacealtında tutulan bir ortamda, Git kimliğini klasör konumuna göre değil remote URL temelinde ayırmak daha doğru olur - Git'in
includeIfözelliğigitdirile yol bazlı ayarları yükleyebilir, ancak aynı çalışma dizini içinde farklı hesaplara ait depolar karışıyorsa yol temelli dallanma sınırlarına ulaşır hasconfig:remote.*.url:koşulu kullanılırsa GitHub, GitLab, SourceHut veya belirli bir GitHub organizasyonu gibi remote URL desenlerine göre ayrı yapılandırma dosyaları dahil edilebilir- SSH anahtarları
~/.ssh/configiçindeHost,Hostname,User,IdentityFileile ayrıca yönetilmelidir; aynıgithub.comüzerinde bile organizasyona göre farklı anahtar kullanmak için Host takma adı gerekir url.<base>.insteadOfbirlikte ayarlanırsa her zamanki gibigit@github.com:orgname/projectkullanırken içeride bunungh-work:orgnamebiçimine çevrilmesi ve doğru SSH yapılandırmasının devreye girmesi sağlanır
Git ayarlarını remote URL'e göre ayırmak
- Mevcut
includeIförnekleri,gitdir:~/code/**,gitdir:~/work/**gibi yerel dizin yollarına göre farklı yapılandırma dosyalarını dahil eder~/codealtında~/.config/git/personal,~/workaltında ise~/.config/git/workyüklenebilir- Dahil edilen dosyalarda genellikle
user.name,user.email,user.signingkeygibi Git kimliği ve imza anahtarı ayarları bulunur
- Tüm kodu
~/workspacealtında tutarsanız kişisel,work-1,work-2depoları aynı yol yapısı içinde karışabilir; bu yüzden yalnızca yol tabanlı koşullarla istenen ayrımı yapmak zorlaşır - Git'in
hasconfig:remote.*.url:özelliği kullanılırsa, mevcut depoda belirli bir remote URL bulunduğunda yapılandırma dosyası yalnızca o zaman dahil edilebilirgit@github.com:*/**ile eşleşirse~/.config/git/config-ghgit@github.com:orgname/**ile eşleşirse~/.config/git/config-gh-orggit@gitlab.com:*/**ile eşleşirse~/.config/git/config-glgit@git.sr.ht:*/**ile eşleşirse~/.config/git/config-srht
- Git son eşleşen yapılandırmayı dahil ettiğinden koşul sırası önemlidir
github.com:orgname/**koşulu, genelgithub.com:*/**koşulunun altında yer almalıdır; aksi halde organizasyona özel ayar genel GitHub ayarı tarafından ezilebilir
- Sonuç olarak
github.com:orgname/**remote'una sahip depolarconfig-gh-orgkullanır; diğer GitHub depoları ise genel GitHub yapılandırmasını kullanır
SSH anahtarları ve insteadOf ile organizasyon bazlı bağlantı bilgilerini eşleştirmek
- Git kimliğinden ayrı olarak, remote'a
pullvepushyapabilmek için SSH anahtarı yapılandırması gerekir~/.ssh/configiçindegitlab.comiçin~/.ssh/gitlab.id_ed25519github.comiçin ise~/.ssh/github.id_ed25519gibiIdentityFilebelirtilebilir
ssh-agentayarına bağlı olarak herHostiçinIdentityFilealtınaIdentitiesOnly yeseklemek faydalı olabilir- Aynı
Hostnameolangithub.comüzerinde organizasyona göre farklı anahtarlar kullanmak istiyorsanızHostdeğerlerini farklı vermelisiniz- Yapılandırma
Host gh-work,Hostname github.com,User git,IdentityFile ~/.ssh/work.id_ed25519biçimindedir
- Yapılandırma
- Git ayarlarında
url "gh-work:orgname"veinsteadOf = git@github.com:orgnamekullanılırsa Git URL'si otomatik olarak dönüştürülebilir- Kullanıcı
git clone git@github.com:orgname/projectgibi bir komut girer - Git,
github.com:orgnamekısmınıgh-work:orgnameolarak değiştirir ve~/.ssh/configiçindekigh-workayarını kullanır
- Kullanıcı
- Bu yöntem, SSH and multiple Git credentials yazısındaki bir hileden alınmıştır; birlikte başvurulan diğer yazılar şunlardır
1 yorum
Hacker News yorumları
insteadOfyerine depoyugh-work:org/repoolarak klonlayıp Git ayarlarınaincludeIf "hasconfig:remote.*.url:gh-work:**/**"koyuyorBöylece
gh-workaltında tanımlı SSH kimliği ile klonlanan depo, içinde Git kimliği ve SSH ayarlarıyla aynı imza anahtarı bulunangh-work.incayarlarını otomatik olarak alıyorSonuçta
gh-workadı SSH kimliği ile Git kimliğini ayıran ölçüt oluyor ve anlaması daha kolay hale geliyorincludeIfbüyük/küçük harfe duyarlıdır ve öncelikte en son ayar kazanırDüzgün çalışıp çalışmadığını kontrol etmek için
git remote get-url originvegit config --get user.emailçalıştırılabilirDaha iyi yöntemin,
HOMEaltındaki.gitconfigiçinde kimliğe göre alias’lar tanımlayıp depoyu başlattıktan veya klonladıktan hemen sonragit config-companyya dagit config-personalçalıştırmak olduğunu düşünüyorumuser.useConfigOnly = trueaçılıp alias içinde yerel deponunuser.email,user.name,core.sshCommanddeğerleri sırasıyla kişisel/şirket SSH anahtarına ayarlanabilirYazıdaki yöntemin, organizasyondan klonlayınca doğrudan çalışması avantaj gibi görünüyor
Eskiden bir startup’ta her gün kimliğini masal karakteri gibi rastgele bir ada çeviren biri vardı
Pazartesi commit’leri Mr. Bunnymann, salı commit’leri Doctor Funtime gibiydi; sürüm kontrol forensiği yaparken çok zahmetliydi
İyi niyetle bakarsak, herkes kimlik ayarına herhangi bir değer koyabildiği için bu değere fazla güvenilmemesi gerektiğini hatırlatmaya çalışıyor olabilir
Yine de ayrıntı sormak veya stil ve uzmanlığı öngörmek için kimin yaptığını bilmek faydalıdır
Commit’lerde GPG imzası zorunlu tutulup izin verilen GPG kimlikleri kaydedilirse, yazar/committer meta verileri yerine imza üzerinden gerçek yazar tanımlanabilir
Tabii “basitçe” ile GPG imzası her zaman iyi anlaşmaz
Çalışanın kendi commit’lerini düzgün tanımlayacağına güvenemiyorsanız, bence işten çıkarmalısınız
~/.ssh/configdosyasına dokunmaya gerek kalmadan,~/.gitconfigiçine ya da yazıdaki gibi~/.config/git/personaliçinecore.sshCommand = /usr/bin/ssh -o IdentitiesOnly=yes -i ~/.ssh/IdentityFile2 -akoyabilirsinizBöylece
insteadOfolmadan da submodule işleri kolaylaşırUzun süredir dizin tabanlı
includeIfkullanıyordum (https://www.bobek.cz/til/git-identities/);hasconfig:remotegerçekten çok temizDepo klonlanırken de çalışıyor
includeIfoldukça iyiŞu anda SSH karmaşıklığını
~/.sshaltında tutuyor, her müşteri/proje/kimlik için bir include kullanıyorumGitHub gibi benzersiz host adı olmayan yerlere
customer-githubgibi host alias’ı veripHostName github.com,IdentityFile ~/.ssh/customer_rsa,User gitşeklinde ayarlıyorumSonrasında
git cloneiçinde sadece o alias’ı kullanmak yeterliAynı sorunu yaşıyordum ve artık bir çözüm çıkmış oldu
NixOS ve home-manager’ı Linux ve Mac’te kullanırsanız bu ayar basitleşiyor
programs.git.includesiçinecondition = "hasconfig:remote.*.url:git@github.com:/**"veuser.emailayarını koymak yeterliReferans: https://nix-community.github.io/home-manager/options.xhtml#opt-programs.git.includes
.gitconfigiçine yazmaktan daha az basit görünüyorYazıdakiyle aynı koşul ve ayar; buna bir de build/şablon aşaması ve tuhaf söz dizimine sahip yeni bir programlama dili öğrenmek ekleniyor
Zaten
includeIf: "gitdir"ile iş ve kişisel ayarlarımı ayırıyordum;hasconfig:remoteise oyunun kurallarını tamamen değiştiren bir özellikDanışmanlara her zaman iş için ayrı bir makine kullanmalarını ya da en azından ayrı bir OS kullanıcısı kullanmalarını güçlü şekilde öneririm
Kişisel makineyi iş için kullanmak ciddi sıkıntı yaşama riski doğurur
Remote-first bir şirkette dizüstü bilgisayarı kendiniz temin edip 2-3 yılda bir yeni cihaz alma parası almanıza rağmen bunun hâlâ kişisel laptop olduğu durumlar da var; geçici sözleşmeli çalışan da olabilirsiniz
Hangi durumda neden sorun olduğunu daha somut açıklamak gerekir
Risk gerçekten var, ama sıralayamıyorsanız bu eğitimden çok FUD yaymaya yaklaşır
Proje bazında Git kimliğini kolayca değiştirmek için yaptığım araç: https://github.com/cquintana92/git-switch-user
Kimliği ayarladıktan sonra
$ git su Personalveya$ git su Workçalıştırınca e-posta, ad, SSH anahtarı ve isteğe bağlı olarak PGP anahtarı da deponun.git/configdosyasına yazılıyorBana çok zaman kazandırdı
12 yıllık bir araç ama hâlâ aktif olarak bakımı yapılıyor