Günümüzde açık kod camiası tarafından en çok tercih edilen versiyon yönetim sistemleri (VYS) Concurrent Versions System (CVS) ve CVS'in yeni ve geliştirilmiş hali olan Subversion(SVN)'dir. Versiyon yönetim sistemleri sadece programların kaynak kodlarını yönetmek için değil çok çeşitli işler için kullanılabilmektedir. Örnek vermek gerekirse, herhangi bir GNU/Linux makinede kendi ev dizinimizi (home directory) VYS yardımıyla yönetebiliriz. (http://linuxjournal.com/article/5976). Kısacası kaybetmek istemediğimiz ve ileri bir tarihte eski hallerini görmek isteyeceğimiz veya aynı anda birden fazla kişinin düzenlediği herhangi bir dosya için VYS kullanabiliriz. CVS hakkında daha fazla bilgi edinmek istiyorsanız CVS Açık Kod Yazılım Geliştirme dökümanına bakabilirsiniz.
Bu dökümanda üzerinde GNU/Linux çalışan bir makineye nasıl SVN-Apache kurulacağını, bu programların nasıl yapılandırılacağını, nasıl SVN kaynak deposu oluşturulup, kullanılacağını, oluşturduğumuz SVN kaynak depolarının nasıl test edileceğini ve dökümanın en sonunda elimizde bulunan CVS kaynak kodlarını nasıl SVN kaynak kodlarına çevirebileceğimizi kısaca anlatmaya çalışacağım.
Öncelikle kısaca SVN'e değinelim;
SVN bir önceki nesli olan CVS'in hemen hemen bütün özelliklerini içermektedir, bu ikisi arasındaki farklılıklara kısaca;
ve bunlara ek olarak SVN yeni bir çok özellik daha barındırmaktadır. SVN'nin diğer özelliklerini, gelişmeleri ve detaylı açıklamaları http://subversion.tigris.org/ adresinden öğrenebilirsiniz.
Bu dökümanı hazırlarken SVN sunucusunun çalışacağı platform olarak SUSE 9.3 kullandım fakat yeri geldiğinde aynı işlemleri Debian ve türevlerinde nasıl yapabileceğinizi de anlatmaya çalışacağım. SUSE'yi http://www.opensuse.org, Debian'ı http://www.debian.org, Ubuntu'yu http://www.ubuntulinux.org adreslerinden temin edebilirsiniz.
SVN sunucuyu kullanmanın tavsiye edilen yöntemi SVN-Apache entegrasyonudur, diğer yöntem ise svnserve programını kullanmaktır. İkinci yöntemi bu dökümanda anlatmayacağım, detaylı bilgi almak isteyen arkadaşlar var ise http://svnbook.red-bean.com/en/1.1/ch06s03.html adresindeki dökümandan istedikleri bilgiye ulaşabilirler.
SUSE'ye SVN ve Apache kurmak için YAST'ı konsoldan veya grafiksel arayüzden çalıştırıp aşağıdaki paketleri kurmamız gerekmektedir.
Debian için ise;
sudo apt-get install apache2
sudo apt-get install subversion libapache2-svn subversion-tools
İlk olarak bütün kaynak depolarımızın tutulacağı bir klasör belirleyelim (/subversion/depo) ve bu klasörün
sahipliğini wwwrun kullanıcısına (Apache tarafından kullanılan kullanıcı) verelim. Daha sonra ise wwwrun kullanıcısına geçip svnadmin komutunu kullanarak
bir svn deposu oluşturalım. (SUSE'de sistem kullanıcılarına bir kabuk programı atanmadığından bu kullanıcıya
su - wwwrun
komutuyla geçmeye çalıştığınızda başarısız olacaksınızdır. Bundan dolayı bu şu komutları sırasıyla
root olarak çalıştırmak gerekmektedir)
linux: # mkdir /subversion
linux: # mkdir /subversion/depo
linux: # chown wwwrun:www /subversion/depo
linux: # su --shell=/bin/sh -c "svnadmin create /subversion/depo/projem" wwwrun
Aynı işlemleri Debian'da yapmak için ise;
linux: # sudo su
linux: # mkdir /subversion
linux: # mkdir /subversion/depo
linux: # chown www-data:www-data /subversion/depo
linux: # su - www-data
linux: # svnadmin create /subversion/depo/projem
linux: # exit
Birinci adımın başında da belirttiğim üzere SVN'nin tavsiye edilen sunucu kullanımı SVN-Apache entegrasyonudur. Apache'yi SVN kullanmak üzere yapılandırmak SVN kaynak deposu oluşturmak kadar kolaydır. Tabii ki Apache yönetimi ve kullanımı oldukça detaylı bir konu burada bu detaylara inemeyeceğim, sadece SNV-Apache entegrasyonu için nerede ne yapmamız gerektiğini adım adım anlatmaya çalışacağım.
Apache yapılandırması için;
SUSE'de /etc/apache2/vhosts.d klasörü altına subversion.config isimli bir dosya oluşturup ve bu dosyayı aşağıdaki şekilde düzenleyelim.
<VirtualHost *:80> ............... 1 ServerAdmin siteyoneticisi@email.com ............... 2 ServerName svn.sitemiz.com ............... 3 LoadModule dav_module /usr/lib/apache2/mod_dav.so ............... 4 LoadModule dav_svn_module /usr/lib/apache2/mod_dav_svn.so ......... 5 LoadModule authz_svn_module /usr/lib/apache2/mod_authz_svn.so ..... 6 ErrorLog /var/log/apache2/svn-server-error_log ............... 7 LogLevel warn ............... 8 CustomLog /var/log/apache2/access_log combined ............... 9 HostnameLookups Off ............... 10 UseCanonicalName Off ............... 11 ServerSignature On ............... 12 <Location /projem> ............... 13 Order allow,deny ............... 14 Allow from all ............... 15 DAV svn ............... 16 SVNPath /subversion/depo/projem ............... 17 Satisfy any ............... 18 Require valid-user ............... 19 AuthType Basic ............... 20 AuthName "Projem icin SVN by ULATH" ............... 21 AuthUserFile /subversion/.dav_svn.passwd ............... 22 AuthzSVNAccessFile /subversion/.svn_access_file ............... 23 </Location> </VirtualHost>
1. satırda apache'de 80 nolu porttan gelen istekleri kabul edecek bir VirtualHost çalışacağını belirtiyoruz. 4,5 ve 6. satırlarda SVN ve Apache'nin birlikte çalışabilmesi için sistemimizde bulunması gereken modüllerin yüklenmesini istiyoruz. (Bu modüller 1. adımda yüklediğimiz programlarla beraber geliyor.) 7,8,9,10,11 ve 12. satırlar klasik Apache yapılandırma satırları, bunlarla ilgili detaylı bilgileri apache dökümanlarından elde edilebilir. SVN'in çalışması için önemli yapılandırmalar 13. ve sonraki satırlar.
13. satırda depoya erişim isminin projem olmasını istiyoruz. (örnek, http://server_ip_no/projem
)
14 ve 15. satırlarda apache'nin her bağlantıyı kabul etmesini istiyoruz.
16. satırda SVN kurulumu ile birlikte gelen ve 4,5,6. satırlarda yüklediğimiz modüllerin DAV sağlayıcı olarak çalışmasını istiyoruz.
17. satırda oluşturduğumuz SVN deposunun yerel diskimizdeki konumunu veriyoruz.
18,19,20. satırlarda SVN'e bağlanılırken kullanılacak kullanıcı doğrulama yöntemlerini belirliyoruz.
21. satırda kullanıcı adı ve şifre sorulan ekranda gösterilecek bilgiyi belirliyoruz.
22. satırda SVN deposunu kullanabilecek kullanıcıların kullanıcı adı ve şifrelerinin bulunduğu dosyanın yerel
diskimizdeki yerini belirtiyoruz. (Bu dosyayı biraz sonra daha detaylı açıklamaya çalışacağım)23. satırda ise hangi kullanıcının hangi depolara erişip, erişemeyeceğini ve bu depolar üzerindeki erişim
haklarını belirleyen dosyanın yerel diskimizdeki yerini belirtiyoruz. (Bu dosyası da biraz sonra detaylı olarak açıklamaya çalışacağım)
Debian'da ise, yukarıdaki VirtualHost tanımlamasını /etc/apache2/sites-available/ klasörü altında subversion isimli yeni bir dosya oluşturup, bu dosyanın içine eklemeliyiz. Ayrıca 4, 5 ve 6. satırlarda yüklenmesini istediğimiz modüller Debian'da /usr/lib/apache2/modules/ klasörü altındadır, bu satırları bu farklılığı göz önünde bulundurarak yeniden düzenlememiz gerekmektedir. (Yukarıda yazdığımız Virtualhost tanımlaması debian ile beraber gelen default konfigurasyon ile çakışacaktır bundan dolayı /etc/apache2/sites-enabled klasörü altındaki 000-default isimli linki silmemiz gerekecektir). Son olarak,
linux: # ln /etc/apache2/sites-available/subversion /etc/apache2/sites-enabled/subversion
komutu ile sites-enabled klasörü altında sites-available/subversion dosyasına bir link oluşturmamız gerekmekte.
Apache yapılandırmasından sonra yapmamız gereken, bir önceki aşamadaki 23. ve 23. satırlarda belirtilen dosyaların tanımlanması ve yapılandırılmasıdır.
Kullanıcı tanımları için /subversion klasörü altında .dav_svn.passwd isimli bir dosya oluşturup, bu dosyaya htpasswd2 yardımıyla kullanıcı eklemeliyiz,
linux: # htpasswd2 -cm /subversion/.dav_svn.passwd ulath
bu komut size bir şifre soracaktır, bu şifreyi girdikten sonra kullanıcımızın oluştulması işlemi tamamlanacaktır.
Yeni bir kullanıcı eklemek için yukarıdaki komutu htpasswd2 -m kullanıcı_adı
şeklinde değiştirmek gerekecektir.
İlk komutdaki -c parametresi kullanıcı adı ve şifrelerin tutulacağı dosyayı oluşturmak
içindir. Örnek olması için bir tane daha kullanıcı ekleyelim,
linux: # htpasswd2 -m mhazer
Kullanıcıların erişebileceği depoları belirlemek, ve bu depolar üzerindeki haklarını belirlemek için ise /subversion klasörü altında .svn_access_file isimli bir dosya oluşturup,
linux: # vi /subversion/.svn_access_file
daha sonra bu dosyayı aşağıdaki şekilde düzenlememiz gerekmektedir.
[projem:/]
ulath = rw
mhazer=r
Bu dosyada, projem isimli deponun ulath isimli kullanıcının okuma ve yazma yetkisi ile, mhazer isimli kullanıcının ise sadece okuma yetkisi ile kullanabileceği belirtilmektedir. Eğer ikinci bir projemiz olsaydı ve bu projenin her iki kullanıcı tarafından okuma ve yazma yetkisi ile kullanılmasını ve herhangi bir kullanıcı tarafından sadece okuma yetkisi ile kullanmasını isteseydik bu dosyanın içeriği aşağıdaki şekilde olacaktı;
[projem:/]
ulath = rw
mhazer=r
[projem2:/]
ulath = rw
mhazer=rw
*=r
Bu dosyada yapılabilecek tanımlamalar ve daha detaylı açıklamalar için http://svnbook.red-bean.com/en/1.1/ch06s04.html adresini ziyaret edebilirsiniz.
Bu işlemler bittikten sonra SVN'i kullanmaya geçmeden önce tek yapmamız gereken Apache'yi restart etmek.
linux: # apache2ctl restart
Buraya kadar yaptıklarımızla SVN-Apache kurulumunu ve entegrasyonunu tamamlamış olduk, kurduğumuz sistemi test etmeye geçebiliriz. Internet tarayımızın adres satırına http://svn_sunucu_ip/projem yazdığımızda karşımıza kullanıcı adı ve şifre soran bir ekran gelmesi ve 5. adımda belirlediğimiz kullanıcı adımızı ve şifremizi girdiğimizde projemize ait Subversion sayfasının açılması gerekmektedir. Bu bize SVN deposunun başarıyla oluşturulduğunu ve Apache'nin wwwrun veya www-data kullanıcısının bu SVN kaynak deposuna başarıyla eriştiğini gösterir. Test aşamasının son adımı olarak svn sunucusuna bir dosya eklemeyi deneyebiliriz. Bu test aşaması için eclipse (http://www.eclipse.org) ve subclipse (http://subclipse.tigris.org/) plugin'inini kullanabilirsiniz veya tercih ettiğiniz SVN desteği olan diğer bir IDE (Integrated Development Environment) veya tortoisesvn (http://tortoisesvn.tigris.org/) gibi bir yazılım kullanabilirsiniz, biz bu aşamada testi konsoldan SVN komutlarını kullanarak yapacağız.
linux: # svn --username mhazer checkout http://svn_sunucu_ip/projem
komutuyla SVN kaynak deposundaki dosyaları çalışmakta olduğumuz klasöre alalım. Daha sonra,
linux: # vi Deneme.java
komutuyla bir dosya oluşturalım ve kaydederek vi'dan çıkalım. Bu dosyayı SVN'e eklemek için,
linux: # svn add Deneme.java
linux: # svn commit Deneme.java -m "Sadece deneme yapiyoruz!"
eğer tarayıcımızın adres satırına http://svn_sunucu_ip/projem yazarsak Deneme.java dosyasını açılan sayfada görmemiz gerekmektedir. SVN komutları ve daha detaylı açıklamaları için http://svnbook.red-bean.com/en/1.1/ web sayfasını mutlaka ziyaret etmelisiniz.
Eğer sizde benim gibi projelerinizde CVS kullanıyorsanız, bir an önce bu projelerinizi SVN'e taşımak isteyeceksinizdir. CVS kaynak depolarının SVN'e tarihsel veriyle birlikte taşınması için cvs2svn isimli yazılımı kullanabilirsiniz. Bu yazılımı YAST kullanarak veya Debian'da
linux: # sudo apt-get install cvs2svn
komutuyla kurabilirsiniz.
Kaynak depolarınızı CVS'den SVN'e dönüştürmeden önce karar vermeniz gereken en önemli adım
CVS'den SVN'e ne kadarlık tarihsel veri taşımak istediğinizdir. Bu dökümanda biz elimizde bulunan CVS deposunu
bütün tarihsel verisiyle beraber SVN deposuna dönüştüreceğiz. Diğer dönüştürme alternatifleri için
CVS2SVN dökümanına bakabilirsiniz.
Yeni oluşturacağımız SVN kaynak depomuzun yerel diskimizdeki yerinin /subversion/depo/projem
olacağını varsayalım. Dönüştüreceğimiz CVS kaynak deposunun bir kopyasını (cvs2svn CVS kaynak deposu üzerinde
hiç bir değişiklik yapmamaktadır ama biz her ihtimale karşın kopyası üzerinde çalışağız) /subversion/gecici
klasörü altına koplayalım. Kopyalama işlemi bittikten sonra SVN deposunun oluşturulması için;
linux: # cvs2svn -v -s --username=ulath --trunk=projem-devel /subversion/depo/projem
/subversion/gecici
komutunu çalıştırmak yeterli olacaktır.(Eğer co command not found
gibi bir hata alırsanız, ki ben aldım,
sisteminizde RCS (Revision Control System) kurulu değildir. Bu sorunun iki çözümü var, birincisi
yukarıdaki komuta --use-cvs parametresini vermek (çok yavaş çalışıyor), ikincisi ise sisteme RCS'yi kurmak)
Yukarıdaki komut eğer hata vermeden biterse eski CVS kaynak deponuz başarıyla SVN'e dönüştürülmüş olacaktır.
3. adımdan sonraki adımlarda anlatılan Apache konfigurasyonlarını yaparak yeni SVN kaynak deponuzu kullanmaya
başlayabilirsiniz.
Eğer bütün adımları sırayla yapıp test aşamasınıda başarıyla geçmişseniz tebrikler SVN kullanmaya başlayabilirsiniz. Dökümanın en başında da belirtildiği üzere SVN'i çok çeşitli alanlarda kullanabilirsiniz, artık SVN'i kullanacağınız alan sizin ihtiyacınıza ve hayal gücünüze kalmış.
Bu kısa dökümanda SVN'nin bütün özelliklerinin detaylıca anlatılması oldukça zor, daha detaylı bilgiler için referanslar mutlaka detaylı olarak incelenmeli. Bu döküman hakkındaki her türlü düşüncelerinizi ve düzeltmeleri bana iletebilirsiniz. (murathazer (at) gmail.com)
Döküman güncellemeleri ve yeni bilgiler için http://www.projedunyasi.org web sitesini ziyaret edebilirsiniz.
Herkese iyi çalışmalar.
1- Version Control with Subversion (http://svnbook.red-bean.com/en/1.1/)
2- Running Subversion on Debian Sarge and Apache 2 (http://blog.odonnell.nu/32.html)
3- A Novices Tutorial on Subversion (http://www.germane-software.com/%7Eser/R_n_R/subversion.html)
4- Apache 2.0 documentation Apache Docs