Tuesday, April 21, 2009

Git ile Baslangic

Git ile kaynak kod idaresine baslamak cok kolay. Depoya cevirilecek bir dizine girilir ve alttakiler komut satirinda isletilir.
git init
git add .
git commit -m "ilk commit burada"
Gorsel olarak Git kullanmak icin Gitk var. Emacs uzerinden Git komutlari kullanabilmek icin git-emacs paketi oldukca iyi; tanidik C-x v v komutlari bulunabilir, yorumlar editor icinden girilebiliyor, vs.

Git sisteminin neler yapabildigini ogrenmek icin Git Magic e-kitabini da tavsiye ederim.

Git her kullanicinin kendi deposunu merkez alarak "yerel" calisabilmesini saglar; mesela dallanma, birlestirme gibi hicbir islem icin network'teki bir "merkezi" servise bagli olmaniz gerekli degildir. Git'teki ana kavram "klonlama", "cekmek" ve "itmek" kavramlaridir, ki bu islemlerin hepsi de ayni depodan baslayan ama uzerlerinde ayri calisilan bagimsiz depolari temel alirlar. Iki programci, sadece birbirlerine gercekten kod vermek istedigi zaman, network uzerinden birbirine kod itip, ceker.

Bizim ilk Git kullanisimiz yedekleme amacliydi, ayrica iki makinada ayni kod uzerinde calisiyor olmamiz bir sekilde idare edilmeliydi. Isin ilginc tarafi, bahsedilen turden kullanimlar icin Git'in mentalitesinden hic disari cikmiyorsunuz. Yedeklemede, yedek olan depo sanki uzerinde hicbir programcinin calismadigi bir "klon" haline geliyor, ayri makinada uzerinde calisilan ayni kod ise (aslinda ayni olan) sanki iki programcinin iki ayri klon uzerinde calisiyor olmasi haline geliyor.

Basit yedekleme ile baslayalim: Bir dizini Gitlestirdikten sonra, yedek icin onu baska bir dizine klonluyoruz:
git clone /dizin/ismi/
Eger ssh uzerinden baska bir makinaya yedekliyorsak, once uzaktaki makinada /dizin/ismi diye bir dizin yaratip o dizin altinda "git init" islettikten sonra lokal makinada sunu isletebiliriz:
git push ssh://kullanici@makina/dizin/ismi master
Bunu islettikten sonra uzaktaki makinadaki dizinin bos oldugunu gorebilirsiniz; o dizin altinda "git checkout master" islettikten sonra dosyalar gorunur olacaktir.

Kendi kopyamiz uzerinde calisiyoruz, istedigimiz kadar commit ediyoruz, vs. Sonra klona (yani yedege) farklari gondermek istiyorsak, o zaman yine ayni komutu benzer sekilde isletiyoruz.
git push ssh://kullanici@makina/dizin/ismi

Uzaktaki makinada guncellenme gerceklestirilmistir; fakat o makinada da en son fiziki dosyalara bakmak isterseniz, o zaman "git reset --hard" komutunu vermeyi unutmayin. Bu komut Git'e "en son commit noktasina gitmesini" soyleyen bir komuttur, en son commit noktasi da push ettiginiz nokta olduguna gore fiziki dosyalar o noktadaki hale donusecektir.

Diyelim ki kendi kod bazimiza bir sey oldu, silindi, vs. Derde gerek yok; Yedeklenmis klon, klonlandigi (ve guncellendigi) andan itibaren tum commit tarihini, her seyi iceren asil bir depodur, o zaman bu depoyu kendimize geri klonlayarak kaldigimiz yerden devam edebilirdik.

Iki makinada farkli klonlarda calisma durumunda ise, klonlari senkronize etmek isteyen kendine kodu "ceker" ve cakismalari cozerek kendi deposuna commit eder, sonra git push ile bu senkronize edilmis hali ikinci klona gonderir.

Onemli bir faktor: Git cok hizli calismaktadir. Linus Torvalds Git'i kernel kodunu idare edebilmek icin yazdi, ve bu kodun ne boyutlarda oldugu bilinen bir sey. Bu gereklilikler isiginda Git hizli isleyecek sekilde tasarlanmis.

Github

Github sitesi "sosyal kodlama" sloganiyla yola cikmis bir sitedir. Bir Git kod deposu, hem yerel hem Github'da tutulur, tabii Git'in "kisiye ozel" ruhuna uygun olarak, birisi Github'da gordugu bir "programcinin projesinde" degisiklik yapmak isterse, bunu o depoyu o "programcinin hesabindan kendi hesabina" klonlayarak yapar. Sonra, tabii ki, kendi hesabindan bir de kendi lokal makinasina klonlama yapar. Lokal kopyada calismalarina baslar.

Mesela; biz Voldemort projesiyle ilgileniyoruz ve bu projeyi ijuma adli arkadastan klonladik.

Bizim kendi baslattigimiz proje pyjde Github uzerinde, oradan isteyen klonlabilir. Bunu yaparak aslinda Github'i hem bir yedekleme noktasi, hem de baskalari ile kodu paylasma ortami olarak kullaniyoruz.

Yedeklemeden bahsedelim: Kendi yerel pyjde klonumuzda (ya da aslimizda) calisip commit ediyoruz. Kodu herkese gostermek ve/ya yedeklemek istedigimizde ise,
git push git@github.com:burakbayramli/pyjde.git
komutu yeterli oluyor. Ustteki url'in ne oldugunu Github size acik bir sekilde gosteriyor, karistirmaya hacet yok. Yanliz dikkat: kullanilmasi gereken "Your" Clone URL, oteki URL degil. Ayrica Github'a kod gonderebilmek icin ssh public anahtarinizi Github'a vermis olmaniz lazim. Ssh konusunu blog'da cok kez isledik (Kurumsal Java kitabinda da konuda bir bolum var). ssh-keygen -t rsa ile urettiginiz .ssh/id_rsa.pub dosyasi icindekileri Github'a verince is bitiyor, bir guven hatti olusuyor, ve sifresiz sekilde Github sanki kendi network'unuze dahil bir makinaymis gibi oraya kod gonderebiliyorsunuz. Ssh ayarlari ustteki kullanici@makina ornegi icin de gecerli tabii ki. Birden fazla makina uzerinde calisiyorsaniz o makinada anahtar uretimi yapip bu yeni anahtarin public olanini Github'a verince (Add Key ile) o makinadan da sifresiz olarak calisabilmeye basliyorsunuz.

Bir not daha: Anahtari proje bazinde degil, hesabiniz (account) bazinda tanimlayin. Butun projeleriniz ayni anahtari kullanabilsin yani. Bunun icin Github sayfanizda "Account Settings" menusunu secin, ve oradan "SSH Public Keys"'e gidin. Burada id_rsa.pub dosyanizin icindeki degerleri ekleyebileceginiz secenekler var. Birden fazla acik anahtar eklenebilir, eklenenler silinebilir, vs.

Bir suredir Git kullaniyorum, ve kesinlikle CVS ve Subversion'a donmek gibi bir istegim kalmadi. Gidisat dagitik calisabilen kod depolama sistemleri yonunde; bu sosyal network kavrami ile de birebir uyum icinde; Github'da, aynen Twitter'da oldugu gibi, birini "izlemeye" baslayabiliyorsunuz. Bir "news feed" ozelligi var ve Facebook'ta arkadas takip eder gibi projesini klonladiginiz ya da izlediginiz kisinin commit'leri news feed'inizde gozukuyor!

Github sadece acik yazilim projeleri icin degil, artik sirketler de kodlarini Github uzerine tutuyorlar. Bir admin sizi eklemezse bu projeleri goremiyorunuz yani ama bunun haricinde hersey normal bir Git projesi idaresi ile ayni.

No comments: