Github, Bitbucket, Gitlab gibi git servislerini kullanırken sürekli olarak global tanımlamalarınızla ilgili sorunlar yaşayabiliyoruz. Her projede tekrar tekrar git ortamınıza ait bilgileri girmek de uğraştırıcı olacaktır. İster bu servislerin her birine ayrı ssh ataması yapın, ister birçok ssh'ı aynı serviste kullanın .ssh/config bu karmaşanın önüne kolaylıkla geçecektir.
Tekil Proje Bazında GIT Bilgileri Tanımlamak
Önce her projede tekrar tekrar uyguladığımız yönteme bakalım. Normalde aşağıdaki gibi her git projenizin dizininde global bilgiler yerine local git bilgilerini tanımlayıp işlemlerinizi yaparsınız.
git config user.name "your_username"
git config user.email "your_email@domain.com"
Ancak bu zahmetli ve hata yapmaya çok müsait bir yöntemdir. Ayrıca zaten app password'le uğraşmanızı da gerektirecektir.
Bunun yerine SSH anahtarları üreterek bu SSH anahtarlarını ilgili servislerinize tanımlayıp kolayca yönetebilirsiniz.
ED25519 SSH Anahtarlarını Üretin
Git servisleri artık RSA yerine ED25519 gibi daha performanslı ve güvenli algoritmaları kullanmanızı öneriyor. RSA yakında bu sistemlerden tamamen kaldırılacak. SSH anahtarlarımızı bu yüzden ED25519 ile üretip ilgili servislere yüklemesini yapalım;
ssh-keygen -t ed25519 -C "name_surname@gmail.com" -f "~/.ssh/id_ed25519_github_name_surname_gmail"
ssh-keygen -t ed25519 -C "hi@name_surname.com" -f "~/.ssh/id_ed25519_github_hi_name_surname"
ssh-keygen -t ed25519 -C "name_surname@yandex.com” -f "~/.ssh/id_ed25519_bitbucket_name_surname_yandex"
Burada 3 farklı git hesabı için 3 farklı ssh oluşturdum. Siz ihtiyacınız kadarını oluşturabilirsiniz. İlgili isimlendirmeleri kendinize göre değiştirebilirsiniz.
Anahtarları .ssh/config’den yönetin
nano ~/.ssh/config
ile bir config dosyası oluşturun veya config dosyası varsa buna yazmaya devam edin. Bu dosya hangi ssh dosyasını ne zaman kullanacağınızı belirlemenizi sağlar.
Aşağıda iki farklı varyasyon ile bu config dosyasını yöneteceğiz. Bunlardan ilki her servis için bir e-posta ile girdiğiniz hesabınızın olduğu yöntem.. Diğeri ise her servis için farklı e-postalar ve ssh anahtarları ile bağlantı kurduğunuz isim tanımlama yöntemi..
Github ve Bitbucket için ayrı SSH’lar
Burada iki farklı serviste iki hesap tanımlı. Bu sayede özel olarak repo'ya istek yaparken bunu belirtmemiz gerekmeyecek.
- Github: Kişisel Hesap (name_surname@gmail.com)
- Bitbucket: İş Hesabı (name_surname@yandex.com)
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github_name_surname_gmail
IdentitiesOnly yes
Host bitbucket.org
HostName bitbucket.org
User git
IdentityFile ~/.ssh/id_ed25519_bitbucket_name_surname_yandex
IdentitiesOnly yes
Bu ~/.ssh/config dosyasındaki Host girdileri, farklı SSH anahtarları ile tanımlanmıştır. Her SSH anahtarı farklı bir hizmet (GitHub veya Bitbucket) ile eşleştirilmiştir. User girdisi hemen hemen her zaman "git" olacaktır, çünkü bu hizmetlerde Git işlemlerini bu kullanıcı adı altında sağlarız.
IdentitiesOnly yes satırı, belirtilen IdentityFile dışındaki kimlikleri devre dışı bırakır. Bu, sistemin yanlışlıkla başka bir anahtarı kullanmaya çalışmasını engeller ve doğru anahtarın kullanılmasını garantiler.
Github ve Bitbucket için çoklu SSH’lar
Burada örneğin Github'da iki farklı hesaba Bitbucket'ta bir hesaba girdiğinizi varsayıyoruz. Bu durumda Host isimlerinde küçük bir değişiklik yapmalı ve clone, push isteklerimizi bu isimlerle yönetmeliyiz.
- Github: Kişisel Hesap (name_surname@gmail.com)
- Github: İş Hesabı (hi@name_surname.com)
- Bitbucket: İş Hesabı (name_surname@yandex.com)
Host github-namesurname
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github_name_surname_gmail
IdentitiesOnly yes
Host github-hinamesurname
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github_hi_name_surname
IdentitiesOnly yes
Host bitbucket
HostName bitbucket.org
User git
IdentityFile ~/.ssh/id_ed25519_bitbucket_namesurname_yandex
IdentitiesOnly yes
Artık git komutlarını çalıştırırken, GitHub hesabınızı belirtmek için github-namesurname: veya github-hinamesurname ve Bitbucket için bitbucket kullanabilirsiniz. Örneğin:
git clone git@github-namesurname:workspace/reponame.git
git clone git@github-hinamesurname:workspace/reponame.git
git clone git@bitbucket:workspace/reponame.git
Gördüğünüz gibi bitbucket dışındaki tüm servis isimlerinde değişiklik yaparak bizim belirlediğimiz şartlarla ilgili servise gitmesini sağladık.
SSH Anahtarlarını Github, Bitbucket, Gitlab Gibi Servislere Nasıl Ekleyebilirim?
Son olarak, bu ayarları yaptıktan sonra, her bir anahtarın ilgili servise (GitHub ve Bitbucket) eklenmesi gerektiğini unutmayın. Her bir servisin Ayarlar sayfasında, SSH anahtarları bölümünde, ilgili PUB dosyalarını (~/.ssh/id_ed25519_github_name_surname_gmail.pub ve ~/.ssh/id_ed25519_bitbucket_name_surname_yandex.pub) bulabilirsiniz. Bu anahtarları kopyalayın ve her bir servise yapıştırın.
Bitbucket'ta bunu Personal Settings altından SSH Keys sayfasına ekleyebilirsiniz. https://bitbucket.org/account/settings/ssh-keys/ adresinden erişim sağlayabilirsiniz.
Github'da Settings altında SSH Keys sayfasından ekleyebilirsiniz.
https://github.com/settings/keys adresinden erişim sağlayabilirsiniz.
İlgili Git Servisine Bağlantı Kontrolü
Her şeyin doğru yapıldığından emin olmak için, aşağıdaki komutları çalıştırabilirsiniz:
ssh -T git@github.com
ssh -T git@bitbucket.org
Bu komutlar, ilgili servislerle bağlantıyı test eder. Her iki durumda da "OK" gibi bir başarı mesajı almalısınız.
Bilinen Hatalar
Macos ~Tilde Problemi
Macos’ta ~ (tilde) sorun çıkarıyor olabilir. Bu yüzden oluşturma işlemi için aşağıdaki gibi tam yolu vererek yapabilirsiniz;
ssh-keygen -t ed25519 -C "name_surname@gmail.com" -f “/Users/username/.ssh/id_ed25519_github_name_surname"
..