Subversion (SVN)
Subversion nedir ne değildir ne işe yarar biraz açıklamaya çalışacağım. Subversion bir sürüm takip sistemidir. Kısaca SVN olarak da adlandırılmaktadır.
Ortak bir depoda sürümlenmiş şekilde saklanan proje dosyalarını geliştiriceler kendilerine tanımlanmış kullanıcı adı ile çekebilirler. Kendi depolama alanına çekilen bu dosyalar üzerinde işlemler yapıp tekrar ortak depoya gönderebilirler.
Arada gerçekleşen tüm işlemler Subversion (SVN) sistemi trafından yönetilmektedir.Kurulumu oldukça kolay;
1 |
[root@omeroner ~]# yum install subversion |
Komutu ile svn kurulumunu centos 5.* makinemizde gerçekleştiriyoruz.
Subversion sistemi bir dizi katmanlardan oluşmuş istemci-sunucu uygulamasıdır. svnserve yazılımı bu sistemin sunucusu olarak görev yapar. svnserve istemcilerden gelen isteklerini yerine getir.
Subversion sisteminde versiyonlanması istenen projeler “Depo”-”Repository” olarak adlandırılan ana dizinlerde tutulur. Her yeni proje için bir “Depo” oluşturmak gerekir. “Depo” dediğimiz şey basit olarak svnverve yazılımın çalıştığı bilgisayardaki bir dizin ve onun içerisindeki alt dizinlerden ibarettir.
“Depo”ları doğru düzgün yönetmek için depoları da barındıracak bir ana dizin açmak mantıklı olacaktır. Subversion sunucunun çalıştığı bilgisayarın Linux tabanlı olduğunu kabul edersek, depoları barındıracak bu dizin /home/svn veya /var/svn dizinlerinden birisi olabilir.
Eğer svn dizini yoksa $ mkdir svn komut ile dizin oluşturulabilir. Benim tercihim /var/svn altında bu dizini oluşturmaktır. Subersion sistemini Windows işletim sistemi yüklü bilgisayarlarda çalıştıracaklar ise uygun bir sürücede dizin açıp “depo” lara ev sahipliği yapmasını sağlayabilirler.
1 |
[root@omeroner ~]# <strong>mkdir /var/svn</strong> |
şeklinde bir ana dizin oluşturup tüm depolarımızı bu dizinde oluştursak mantıklı olur.
Depolar sürümlemeye ihtiyaç duyan herhangi bir sınıf, modül, kütüphane veya proje olabilir. Neyi sürümlemek istediğinizle ilgili olarak kullanımınız şekillenecektir.
Eğer bir web geliştiricisi iseniz, geliştirdiğiniz her siteyi yönetebileceğiniz bir depo oluşturabilirsiniz. Eğer bir tercüme takımındaysanız ortaktercüme ettiğiniz dökümanların sürümlerini oluşturabilir takibini gerçekleştirebilirsiniz.
1 2 3 4 |
#svnadmin create –fs-type fsfs /var/svn/depo1 #svnadmin create –fs-type fsfs /var/svn/depo2 #svnadmin create –fs-type fsfs /depo/dizinini/yazın # FSFS alt yapılı depo oluşturur #svnadmin create –fs-type bdb /depo/dizinini/yazın # BERKELEY DB altyapılı depo oluşturur |
yukarıdaki şekilllerde depo oluşturabiliriz. SVN in veri depolama tipi olarak Bekereley DB veya FSFS dosya sistemini tanımlayabiliriz. FSFS tanımlarsak Berkeley DB yönetimi vs ile uğraşmamız gerekmeyecek.
SVN ile sürümlenecek proje geliştirilirken aşağıdaki şekilde bir dizin yapısı oluşturmakta fayda vardır. Bu bir zorunluluk değildir bununla birlikte SVN ile çalışırken kullanılan iyi ve yaygın bir alışkanlıktır.
1 2 3 4 |
#mkdir -p /var/www/proje_1_dizini #mkdir /var/www/proje_1_dizini/trunk #mkdir /var/www/proje_1_dizini/branches #mkdir /var/www/proje_1_dizini/tags |
Proje dosyalarını lokal depolama alanımızda [dolandırmadan söylemek gerekirse harddiskinizde ] proje_1_dizini ismli geçici bir dizine koyduğumuzu düşünelim.proje_1_dizini isimli geçici dizin altında 3 dizin daha oluşturduğumu gördünüz.
Bunlar: trunk, branch, tags. Bu kelimeler yaygın kullanım alışkanlığı olarak artık yerleşmiştir. Projemizdeki tüm dizin ve dosyaları trunk dizini altına kopyalayacağız.
trunk dizini projenin geliştirme safhasındaki halini tutmak içindir.
branches dizinini projenin bir alt dalı, şeklini tutmak için kullanabilirsiz. branches dizinin altındakiler tamamen bizim ne anlam yüklediğimiz ile ilgilidir. Alt test sürümleri, farklı dil versiyon görünümleri vsvs gibi anlamlar yüklenebilir.
/var/www/proje_1_dizini/trunk dizinine kopyalanır. Artık sıra kurduğumuz yapıyı Subversion (SVN) altına göndermeye geldi. Aşağıda önce proje_1_depo adlı bir depo oluşturuyoruz ardından projeyi subversion altına gönderiyoruz.
1 2 3 |
#svnadmin create –fs-type fsfs /var/svn/proje_1_depo #cd /var/www #svn import –message "ilk gonderim" proje_1_dizini file:///var/svn/proje_1_depo |
Burada proje_1_dizini yerine /var/www/proje_1_dizini şeklinde tam dizinde verilebilirdi.
Yukarıdaki komut çalıştırıldıktan sonra artık proje dosyalarını geçici olarak kopyaladığımız yerden (/var/www/proje_1_dizini) silebiliriz.
O dosyalara artık ihtiyacımız kalmadı çünkü SVN /var/www/proje_1_dizini altındaki yapıyı olduğu gibi kendi veritabanına kaydetmiş durumdadır artık. Bundan sonra, SVN deki proje_1_depo isimli depomuzu olduğu gibi veya herhangi bir alt dizinindeki tüm yapıyı istediğimiz klasöre çekebiliriz (checkout).
SVN deki herhangi bir depoyu bulunduğumuz dizine veya istediğiniz birdizine çıkartmak için şu komutu kullanabiliriz
1 |
#svn checkout svn://localhost/proje_1_depo/trunk /istenilen/dizin/ |
yazilir.
eğer kullanıcı adı şifre gerekirse –username kullanıcıadı parametresi verilmelidir. localhost yerine IP veya alan adı yazılabilir
SVN sistemiyle iletişime girmek için birkaç protokol mevcut biz bu örnekde “svn://” protokolünü kullandık.
Mevcut protokoller aşağıdadır
“file:///” sunucunun bulunduğu yerel diskten doğrudan erişim içn kullanılır
“http://” WebDav protokolü ile Apache üzerinden erişmek için kullanılır
“https://” Bu protolok http:// ile aynıdır ama bilgiler SSL şifrelemesi ile iletilir
“svn://” svnserve sunucusuna erişim için kullanılan temel protokoldür
“svn+ssh://” Bu protokol svn:// ile aynıdır ancak SSH tünelin ile veri iletilir. güvenli iletimdir.
checkout yaparken tüm depo veya sadece trunk dizini yapılabilir. Tüm deponun checkout edilmesi durumunda branches, tags ve trunk dizinlerinin hepsi indirilir ki bu durumda proje dosyalarının birden fazla kopyaları harddiske indirilmiş olur. Mantıklı olan trunk dizinini checkout yapmaktır.
checkout yaptıktan sonra dosyalar artık harddiskimizdedir ve istediğimizi yapabiliriz. Ancak checkout ile birlikte ekstra bir dizin gelir .svn adında. Tüm alt dizinlerde birer tane vardır. Dizin altındaki dosyalarla ilgili sürüm bilgilerini barındırır. Bir çok meta data mevcuttur içinde kesinlikle silinmemelidir. Yanlışlıkla silinirse #svn update komutu ile yeniden oluşturulması sağlanır.
1 |
[root@omeroner ~]#svnadmin create |
komutuyla oluşturulan her deponun kök dizininde authz, passwd ve svnserve.conf dosyaları vardır. Oluşurulan depoya erişim haklarını tanımlamak için svnserve.conf dosyası kullanılır.
1 2 3 4 5 |
/var/www/proje_1_dizini/conf/authz /var/www/proje_1_dizini/conf/passwd /var/www/proje_1_dizini/conf/svnserve.conf |
Potansiyel değerler şunlardır.
1. anon-access = none|read|write # anonim erişimdeki hakları tanımlar
2. auth-access = none|read|write # kullanıcı adı ile erişimdeki hakları tanımlar
3. password-db = dosyadi # kullanıcı adı ve şifreleri tutan dosyadır
4. realm = realm-name # depoyu tanımlayıcı bir metin
ömer ve öner isimli iki kullanıcısı olan ve sadece bu kullanıcıların erişim hakkının olduğu, diğer kullanıcılara kapalı bir depo tanım örneği aşağıdadır.
svnserve.conf dosya içeriği;
1 2 3 4 5 6 7 8 9 |
[general] anon-access = none auth-access = write password-db = passwd realm = ilk depom |
passwd dosya içeriği;
1 2 3 |
ömer = sifre1 öner = sifre2 |
Gündelik kullanımdaki iş döngüsü ve kullanılan svn komutları şu şekildedir.
1. Üzerinde çalıştığınız kopyayı güncelleyin
1 |
#svn update |
2. Kopya düzerinde değişiklikler yapın. Dosya değiştirin dizin açın kopyalayın vsvs..
1 2 3 4 |
#svn add #svn delete #svn copy #svn move |
3. Yaptıklarınız hakkında bilgi alın
1 2 |
#svn status #svn diff |
4. Yaptığınız değişklikleri geri alın. önceki bir sürüme geçin
1 |
#svn revert |
5. Çakışmaları giderin, diğerlerinin yaptıklarıyla birleştirin
1 2 |
#svn update #svn resolved |
6. Yaptıklarınızı depoya gönderin
1 |
#svn commit |
HAZIR KULLANIMLIK KOMUTLAR
1 2 3 4 5 6 7 8 9 10 11 |
#svnadmin create /var/svn/depo_adi #yeni depo oluşturuyoruz #svnadmin create –fs-type fsfs /depo/dizinini/yazın # FSFS alt yapıl depo oluşturur #svnadmin create –fs-type bdb /depo/dizinini/yazın # BERKELEY DB altyapılı depo oluşturur #svnadmin hotcopy /depo/dizinini/yazın /depo/dizinini/yazın-backup # depoyu yedekler deponun yedeğini alıyoruz #svn import –m “gönderi mesajı” hedefLokalDizin svn://SVN_SERVER_HOSTNAME_VEYA_IP/depoAdi_VEYA_altDizin #deposya projeyi gönderiyoruz #svn list svn://SVN_SERVER_HOSTNAME_VEYA_IP/depoAdi_VEYA_altDizin #SVN deposundakileri listeliyoruz |
SVN deposundan lokal diskte bulunaln diziye proje dosyalarını çekiyoruz
1 |
[root@omeroner ~]#svn checkout svn://SVN_SERVER_HOSTNAME_VEYA_IP/depoAdi_VEYA_altDizin –username kullaniciAdi |
SVN deposundan son güncel bilgiler lokal diske çekiyoruz
1 |
[root@omeroner ~]#svn update |
Lokaldeki SVN kopyasındaki dosyanın durumu hakkında bilgi alıyoruz
1 |
[root@omeroner ~]#svn status dasyaadi |
Dizindeki tüm dosyaların durumları hakkında bilgi alıyoruz (SVN kopyası)
1 |
[root@omeroner ~]#svn status -verbose |
1. A dosya1 # bu dosya SVN deposuna gönderilmesi için eklendi
2. C dosya2 # ’svn update’ komutu sonrası bu dosyada çakışma oluştu
3. D dosya3 # dosya depodan silinmek üzere ayarlandı
4. M dosya4 # lokal disktei dosyada değişiklik yapıldı
Lokal diskteki dosyada yapılan değişiklikleri geri alıyoruz. (SVN deposuyla içerik aynı hale gelir)
1 |
[root@omeroner ~]#svn revert lokaldosya_adi |
Yapılan değişiklikleri SVN deposuna gönderiyoruz. (SVN kopyası olan dizin içindeyken bu komut verilir. o dizin vealt dizinleri için geçerlidir. )
1 |
[root@omeroner ~]#svn commit -m "birkaç değisiklik yaptım :)" |
Çakışma olan bir dosyanın içeriği elle düüzeltildikten sonra çakışmanın giderilmesi için yapıyoruz
1 |
[root@omeroner ~]#svn reolved lokaldosya_adi |
Lokaldeki ve depodaki dosya loglarını görüntüleyebiliriz.
1 2 3 4 5 |
$ svn log -r 5:19 # 5 den 19 a doğru revizyon loglarını gösterir $ svn log -r 19:5 # 19 dan 5 e doğru revizyon loglarını gösterir $ svn log -r 8 # 8 nolu revizyon logunu gösterir $ svn log DOSYA_ADI # lokalde belirtilen dosyanın logunu gösterir $ svn log svn://SVN_SERVER_HOSTNAME_VEYA_IP/depoAdi_VEYA_altDizin # SVN deposundaki dosya logunu gösterir |
Genel parametreler
-r veya –revision revizyonNumarasi ==> belirtilen revizyon-versiyon üzerinde işlem yapar
-r M:N ==> M ile N revizyon numaraları arasını temsil eder
-v veya –verbose ==> daha detayli bilgi veri
–username kullaniciAdi ==> SVN komutu çalıştırıken kullanıcı adı belirtiyoruz
–password şifre ==> SVN komutu çalıştırırken şifre belirtiyoruz
–no-auth-cache ==> işlem yaparken şifre bilgilerinin tutulmasını engeller
Düzenleme yapılmış tüm dosyalar ve yapılmış değişiklikleri listeler.
1 |
[root@omeroner ~]#svn diff |
3 nolu sürümle mevcut sürüm arasındaki farkı gösteriyoruz.
1 |
[root@omeroner ~]#svn diff -r 3 dosya_adi |
2 ve 3 nolu sürümler arasındaki farkı gösteriyoruz.
1 |
[root@omeroner ~]#svn diff -r 2:3 dosya_adi |
Deneme.txt dosyasının 2 nolu versiyondaki içeriğini gösteriyoruz.
1 |
[root@omeroner ~]#svn cat -r 2 deneme.txt |
Projem1 deposundaki dosyaların listesini verir. daha fazla ekstra bilgi istenirse -v veya –verbose eklenebilir.
1 |
[root@omeroner ~]#svn list svn:://localhost/projem1 |
400 nolu sürümdden yeni bir kopya oluşturur
1 |
[root@omeroner ~]#svn checkout -r 400 |
Mevcut dosyaları 400 nolu sürüm ile günceller
1 |
[root@omeroner ~]#svn update -r 400 |
.svn dizini olmayan temiz birkopya çıkartıyoruz
1 |
[root@omeroner ~]#svn export svn://localhost/projem1 |
SÜRÜM-REVİZYON TANIMLAYICILARI
HEAD : en son (en genç) sürüm
BASE : lokaldeki dosyanın’svn update’ ile alınmış hali ifade eder. lokalde dosyada değişiklik olsa bile görmezden gelinir
COMMITTED : BASE den önceki veya ona eşit commit edilmiş halidir
PREV : COMMITED-1 e denk gelir
örnekler:
Son commit in logunu gösterir
1 |
[root@omeroner ~]#svn log -r HEAD |
Son komitle diskteki edit edilmiş tüm dosyaların farklarını gösterir
1 |
[root@omeroner ~]#svn diff -r HEAD |
Dosya.txt nin diskteki update sonrası orjial hali ile SVN deposundaki son commit edilmiş halinin farkını gösterir
1 |
[root@omeroner ~]#svn diff -r BASE:HEAD dosya.txt |
{Y-m-d} : belirtilen tarihe kadarki son revizyonu temsil eder. {Y-m-d 00:00:00} olarak işlem görür
{Y-m-d 18:30:00} ==> tam tarih belirtimi
1 ekim ile 7 ekim arasındaki logu görüntüler.
1 |
[root@omeroner ~]#svn log -r {2008-10-01}:{2008-10-07} |
Sunucuyu çalıştırma komutumuz aşağıdadır.
1 |
[root@omeroner ~]#svnserve -d -r ROOT_PATH |