Eğer Git hiç kullanmadıysanız, mutlaka önce araştırmanız, denemeniz, fikir sahibi olmanız gerekiyor. Aksi halde aşağıdaki yazdıklarımın size bir şey kazandıracağı konusunda endişeliyim =).
Git, Linus’un, Linux kernelinin geliştirilmesinde kullanmak amacıyla yazdığı bir hızlı sürüm kontrol sistemidir veya sürüm yöneticisidir. Piyasada birçok sürüm yöneticisi bulunmaktadır. Örneğin Pardus geliştiricileri paket yapımında Subversion kullanırlar, Archlinux’ta SVN CVS karışık kullanılmaktadır[1]. Her sürüm kontrol sisteminin birbirlerine göre üstünlükleri ve dezavantajları sözkonusudur. Eğer “Neden Git kullanmalıyım?” diye kendinize soruyorsanız, buna benim vereceğim pek tatmin edici bir cevabım yok; ama şöyle bir bağlantı var, gayet hoş:
http://whygitisbetterthanx.com/
Yalnız bu bağlantıda son madde olarak “Easy to Learn” yazmışlar, o konuda biraz tereddüt ettim, hele ki bayadır SVN kullanıyorsanız, kafanızın haylice karışması mümkün. Çevrimdışı depoda çalışma olayını ilk başta fena halde garipsemiştim. Ama Git’i hızlıca öğrenmek için mutlaka bir GitHub[2] hesabı açın, kurcalayın, alıştırmalar yapın. Şimdi gelelim Gitosis’e..
Gitosis, Git sunucusu kurmanın en güzel yoludur. Bir depo oluşturuyorsunuz, bu depoda görev alacak kullanıcıları (ssh genel anahtarlarını) ekliyorsunuz ve böylece git clone ile depoyu indirip çalışma arkadaşlarınızla ortaklaşa bir yazılım geliştirme fırsatı elde etmiş oluyorsunuz. Ama..
Ama gitosis, sadece izinleri verilmiş kullanıcılar tarafından deponun klonlanmasını sağlayabiliyor. Başka türlü sizden sunucudaki gitosis kullanıcısının şifresini soruyor. Belki gitosis ile oluşturulan depoda sunucu tarafında git daemon export ok komutunu çalıştırmak bunun için işe yarayabilir, henüz deneme fırsatım olmadı. Şimdi gelelim gitosis’in nasıl kurulacağına..
Öncelikle gitosis bağımlılıkları olarak dağıtımınızın paket yöneticisinden git, python ve setuptools’u kurmalısınız. Ayrıca sunucuyla bağlantıyı sağlayabilmek ve gitosis erişim hakkına sahip olabilmek için de SSH kurmanız ve openssh servisini çalıştırmanız gerekir. Bunları kurduktan sonra, gitosis deposundan gitosis’i git’le indiriniz (Nasıl cümle ama?):
$ git clone git://eagain.net/gitosis.git
gitosis dizinine girin. O dizinde root olarak şu komutu verin:
# python setup.py install
Kurulum bu kadar. Ama gitosis için kullanıcı adı ve grup eklemeniz gerekiyor. Bu kısım Pardus kullanıcılarının canını biraz sıkabilir; çünkü her baselayout güncellemesinde bu adımı tekrar tekrar yapacaklar[3]. Sebebi, kullanıcı ve grup bilgilerini tutan dosya baselayout’tan çıkıyor ve siz güncelleme yaptıkça o dosyanın üzerine, yeni baselayout paketinden çıkan dosya yazılacak. Kullanıcı ve grup oluşturma işlemi için root olarak şöyle yapıyorsunuz (Eğer dağıtımınızda /srv dizini bulunmuyorsa /var/spool/gitosis olarak deneyin.):
# mkdir /srv/gitosis
# groupadd -r gitosis &> /dev/null
# useradd -r -m -k /dev/null -g gitosis -d /srv/gitosis -s /bin/sh gitosis &> /dev/null
# chown gitosis:gitosis /srv/gitosis
Kullanıcı ve grubu oluşturduk, gerekli izinleri ve sahiplikleri ayarladık. Bundan sonraki adımımız gitosis’le depo kurulumuyla ilgili olacak. Burada bazı şeyleri açıklığa kavuşturmam gerek. Gitosis’in kurulu olduğu sunucu, bu sunucudaki zorunlu gitosis kullanıcı hesabı, gitosis kullanıcı hesabı dışında herhangi bir gitosis depo yöneticisi olan herhangi bir kullanıcı hesabı ve gitosis depolarına erişimi olan kullanıcılar; işte bunların hepsini birbirlerinden bağımsız olarak ele almanız gerekli. Yani tutup da ben gitosis kullanıcısı açmışım, hem gitosis kullanıcısıyla depo yöneticisi, hem kullanıcı, hem de depoları sunucudan yönetirim diye bir mantık sakın yürütmeyin. Hem güvenli olmayacaktır, hem de muhtemelen bundan sonra yazacaklarımda başarısız olacaksınız. Bu sebeple, gitosis kullanıcısını kullanmayın, hatta parolası bile olmasın, o kullanıcının.
Depo oluşturmaya başlamadan önce, bir depo yöneticisi belirleyin. Benim tavsiyem, sıklıkla kullandığınız bilgisayardaki kullanıcı hesabınız depo yöneticisi olsun. Sunucuda ayrı bir kullanıcı hesabı açmanıza gerek yok; ama zaten sunucuda da size özel bir kullanıcı hesabı varsa, onu da yönetici yapabilirsiniz. Nasıl olsa birden fazla makine veya kullanıcı hesabına da depo yöneticiliği yetkisini sonradan verebiliyorsunuz. Depo yöneticisi olarak seçtiğiniz kullanıcının ssh genel anahtarını sunucuya, “kullanıcı adı @ yerel adres . pub” adıyla gönderin. Örneğin benim bilgisayarımın adı archer, kullanıcı adım gkmngrgn, dolayısıyla ssh genel anahtar adını da gkmngrgn@archer.pub olarak kaydediyorum. Ssh genel anahtar dosyasını herhangi bir metin düzenleyicisiyle açıp satırın sonuna bakarak da nasıl kaydetmeniz gerektiğini öğrenebilirsiniz.
Eğer ssh genel anahtarı oluşturmadıysanız, depo yöneticisi olacak kullanıcı hesabıyla:
$ ssh-keygen -t dsa
komutuyla oluşturabilirsiniz. Soruları geçiş (enter) tuşuna basarak esgeçebilirsiniz. Bu komuttan sonra ~/.ssh/ içinde, id_dsa.pub adıyla bir genel anahtar oluşacaktır. Bu anahtarın ismini biraz önce anlattığım biçimde değiştirin ve sunucuya gönderin. Sonra da aşağıdaki komutla gitosis depolarını oluşturun:
$ sudo -H -u gitosis gitosis-init < /depo/yoneticisi/olacak/kullanicinin/genel/ssh/anahtari.pub
$ sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update
Evet, gitosis kullanıcısının ev dizininde gitosis ve repositories adında iki alt dizin oluştu ve post-update için gerekli izinleri verdik. Şimdi depo yöneticisi olan kullanıcı hesabınızla gitosis-admin deposunu klonlayın:
$ git clone gitosis@:gitosis-admin.git
Bu işlemin ardından, komutu verdiğiniz dizinde gitosis-admin isminde bir dizin göreceksiniz. Onun içinde de bir adet gitosis.conf, bir adet de keydir dizini göreceksiniz. Yetkiler ve depolarla ilgili yapılandırmanın yapıldığı gitosis.conf dosyasının bir örneğini gösterelim:
[gitosis]
[group developers]
members = gkmngrgn@gacer ggorgen@ggorgen-pardus
writable = example
[group admins]
members = ggorgen@ggorgen-pardus gkmngrgn@gacer
[group gitosis-admin]
writable = gitosis-admin
members = @admins
Tek tek açıklayalım; gitosis-admin grubunda yer alan ayarlar, depo yöneticilerinin belirlenmesi ve depo ismiyle ilgili ayarlar. @admins, bir nevi admins değişkeni olarak düşünülebilir ve admins grubunda belirtilen üyeleri döndürüyor. developers grubunda yer alanlar ise, example isimli bir dizinin oluşturulması ve bu example dizinine kimlerin erişebildikleri ile ilgili ayarlar oluyor. Bir depo oluşturmak için gerekli örnek developers dizinidir. Şimdi, bu grupta depoya adını verdiğimiz example ismiyle yerel bir git deposu oluşturalım:
$ mkdir example
$ cd example
$ git init
$ echo "First file." > README # Bunu yazmasanız da olur, örnek bir dosya sadece.
$ git add README
$ git commit -m "First commit on example repository."
$ git push origin master
Son komutla yerel depomuzu gitosis sunucusuna göndermiş olduk. Bundan sonra eşleştirmeler dosyalarınızı bu example dizininde tutabilir, değişiklikleri sunucuya gönderebilir ve benzer şekilde farklı git depoları da oluşturabilirsiniz.
Peki, buraya kadar tamam. Ne güzel git daemon export ok demeden sunucuya erişebiliyoruz, değişiklikleri yapabiliyoruz vesaire. E ama hem siz başka bir makineden ve hatta aynı makinede başka bir kullanıcıdan depoyu klonlayamıyorsunuz, hem de dolayısıyla ekip arkadaşlarınızla ortaklaşa bir uygulama geliştiremiyorsunuz, bunda bir terslik var değil mi?
Tabi ki bir terslik var. example'dan önce indirmiş olduğunuz gitosis-admin dizinine girin. İçindeki keydir dizinine, depoya erişim izni vermek istediğiniz kullanıcıların, bilgisayarların ssh genel anahtarlarını atın. Ama başta ssh oluştururken isimlere gösterdiğiniz titizliği bu anahtarlara da gösterin. Hede@hodo ise Hede@hodo.pub gibi. Daha sonra gitosis.conf dosyasında, example deposu veya herhangi bir deponun üyelerine (members) Hede@hodo (veya her neyse || kimse) olarak ekleyin. Böylece bir depoda ekip çalışması yapma işlemi için başka ek bir emek sarfetmek gerekmeyecek.
Yalnız ssh erişimi olmayan kullanıcıların da sadece depoyu indirebilmelerine izin vermek için, git daemon export ok komutunu araştırmanız, öğrenmeniz gerekecek. Son olarak, şu bağlantıları da incelemenizi tavsiye ediyorum:
http://scie.nti.st/2007/11/14/hosting-git-repositories-the-easy-and-secure-way
http://forum.webfaction.com/viewtopic.php?id=2321
http://wiki.archlinux.org/index.php/Gitosis_Kurulumu
P.S. Gitosis denemelerimin hepsini Pardus 2009'da yaptım, Pardus'ta gayet güzel çalışıyor, gitosis ev dizini olarak /var/spool/gitosis ayarlayın..
[1]: Bu cümle hakkında yorumlarda Alper'in ek bilgisi var, yorumları okuyunuz.
[2]: http://github.com/
[3]: Bu cümle hakkında Türker'in eleştirisi var, yorumları okuyunuz.