Gitextensions - Github - Putty

Bir git macerası daha:
Yeni gui front-end'imiz: gitextensions Putty, msysgit ve kdiff3 kuruyor. Çok anlatılcak birşey yok da github ile bağlantı kurarken ssh keyler filan sorun çıkardı bir dolu vakit kaybı oldu. Yazayım burada bulunsun:

Github'ı remote olarak kullanmak için, shh key çiftlerine ihtiyacımız var.
Burada tutorial: Generating SSH keys (Win/msysgit). Aslında gitextensions'i kullanacağımız için tam olarak bunları yapmamıza gerek yok. Ancak yarın öbür gün bash'dan kullanmak gerekirse bu key'ler de bulunsun.
ssh git@github
Diye bir kez bağlanmayı unutmayın, github'ın public de bizim listemize eklenmiş oluyor böylece. Daha sonra PUSH ederken bir dolu soru sorunca kafamız karışmasın.

Gitextensionsa Putty kurduğu için (aslında iki seçenek var, bunu önermişler, ben de bunu kurdum), key formatı farklı. 
Gitextensions -> Remotes -> PuTTY -> Generate or Import Key  Menüsünden tahmin edin bakalım ne yapılacak? ya yeni key çifti yaratılacak ya da yukarıdaki keyleri import edip PuTTY formatına çevircez. Yeni key çifti yaratıldıysa github.com'a da girilecek.

Repository Clone'larken Load Key seçeneğine, putty'nin private key'ini ekleyeceğiz.
Yapılcak son şey:
~\GitExtensions\PuTTY>plink.exe -i PUTTY_PRIVATE_KEY.ppk git@github.com
Şeklinde bir kez bağlanmak. Yukarıdaki ile aynı mantık. Bunu yapmazsak gui saçmalıyor.

Dropbox + Git

Öncelikle dropbox hesabınız yoksa burdan buyrun: https://www.dropbox.com/referrals/NTY3MTcxNjk
Evet, bu sayade +kota kazanıyorum.

  • Github'da private repo.'lar paralı, gitorious'da hiç yok vs. vs. 
  • Kendimiz kolayca bir sunucu oluşturabiliriz. Apache gibi birşeye de ihtiyacımız yok. Ssh bağlantısı kurabilceğimiz bir pc yeterli. Ancak "asimetrik" dsl hattımızın upload hızını düşünürsek ev sunucusu pek mantıklı değil.
  • USB stickde yanımızda taşısak, autorun.inf'ler malware'ler elbet bir yerde karşımıza çıkacak.
Sonuçta dropbox ile .git repositorylerini "local" olarak sync tutmak mantıklı gibi.

local repomuz ve ilk commit'imiz:

cd ~/projectX
git init
touch readme
git add readme
git commit -m 'first commit'
remote repo. --bare parametresi bu repo da workspace dosyalarının tutulmasını sağlıyor. Daha sonra kaşılıklık çıkmaması için önerilen bir hareket.
cd ~/Dropbox
mkdir projectX.git
cd projectX.git
git init --bare
local repo'ya geri dönüp remote'a değişiklikleri gönderiyoruz:
cd ~/projectX
git remote add origin ~/Dropbox/projectX.git
git push origin master
Diğer bilgisayarlarda
Remote'dan projemizi çekmek için:
git clone ~/Dropbox/projectX.git

git init --bare ne işe yarar
Yukarıda  daha sonra karışıklık çıkmaması için önerilir demiştim. Bu durumda remote repo'da sadece .git klasörü tutuluyor. Çalışma dosyalarımız yer almıyor.
--bare kullanılmazsa bu dosyalarda yer alıyor.
Ortaya çıkan karışıklık şu:
push komutu remote'un local çalışma dosyalarına dokunamadığından .git klasörü güncellenirken, çalışma dosyaları eski kalıyor.
Remote repo sahibinin çalışmasına başlamadan önce "checkout" demezse problemler yaşanabilir diye bunu engellemişler. Yani --bare olmadan push kabul etmiyor.
By default, updating the current branch in a non-bare repository
is denied, because it will make the index and work tree inconsistent
with what you pushed, and will require 'git reset --hard' to match
the work tree to HEAD.
Bunu aşmanın yöntemi ise checkout edilmişin dışında bir branch push etmek, veya remote repo'da bu hatayı kapatmak.

Karmaşık geldi bana, dropbox içinde ikinci bir "local" work copy tutmayı tercih ederim.