27 Ocak 2013 Pazar

SVN trunk,branch,tag hakkında

Sürüm kontrol yazılımı kullanılan yazılım projelerinde çokca trunk,branch ve tag ifadelerini duyarsınız. Burada kısaca aralarındaki farklarından bahsedeceğim.

trunk:

Ana geliştirme alanıdır. Bu alan bir sonraki sürümde yapılacak geliştirmeleri içerir.Buradaki kod alfa seviyesinde bile olmayabilir. Bu yüzden trunk'daki kodlara unstable/karr

branch:

Türkçe olarak çatallama/dallanma/ayrılma anlamlarına gelir.trunk'da geliştirilen kod belli bir seviyeye geldiğinde bir sürüm olarak belirlenir. Sürüm olgunluğuna gelmiş kodun ana geliştirme alanından ayrılması işlemine branch adı verilir. Branch svn deposunda trunk'ın belli bir anına kadarki geliştirmeyi içeren kopyası denilebilir. Genelde branch alma, bir sürüm numarası verilerek yapılır.Örneğin  SurGATE 4.0 sürümü geliştirmesi trunk'da bitti ise aşağıdaki gibi bir komut ile trunk'daki kod SURGATE_4_0_RELEASE olarak ana koldan ayrılmış olur.

$ svn copy https://192.168.0.100/svn/surgate/trunk https://192.168.0.100/svn/surgate/branches/SURGATE_4_0_RELEASE -m "SurGATE 4.0 RELEASE branch" 

Yazılımcılar hiç beklemeden trunk'da yeni özellik geliştirmeye devam ederler.
Bu sayede eğer 4.0 sürümünde bir hata çıkarsa  kolayca  SURGATE_4_0_RELEASE branch'da düzeltilebilir. Branch olmasa idi dosyaların trunk'da 4.0 sürümün çıktığı tarihteki revision numarasına dönmek gerekecekti. Çok fazla dosyanın değiştiği bir projede böyle bir süreci yönetmek imkansız olacaktır.

SURGATE_4_0_RELEASE branch'de düzeltilmiş bir kodu da trunk'a aktarabilirsiniz. Buna merge adı veriliyor. Detaylarına başka bir yazıda değineceğim.

tags

Branch ile benzer özelliklere sahip diyebiliriz. Projenin branch kısmında gerektiğinde bugfix yapılabiliyorken, tag projenin o andaki halinin imajının(snapshot) alınması diyebiliriz. Oluşturulan tag'da hiç bir değişiklik yapılamaz. Tag oluşturmanın amacı projenin belirli bir tarihteki kodlarına erişmektir. Tag = salt okunur, etiketleme

SVN tarafında tag alma ile branch alma aynı şekilde svn copy komutu ile yapılır.

Örnek bir tag alma komutu:


$ svn copy https://192.168.0.100/svn/surgate/trunk https://192.168.0.100/svn/surgate/tags/SURGATE_4_0_RELEASE_TAG -m "SurGATE 4.0 RELEASE Tag" 

Özetle branch'de geliştirme devam edebilir. Fakat tag'da böyle birşey söz konusu değildir.

Ama bir dakika! Hem tag hem de branch alırken svn copy komutunu kullandım. Bu durumda svn hangisinin tag, hangisinin branch olduğunu nasıl ayırt edecek?

Aslında ayırt etmeyecek. Size "yalan" söyledim. svn için branch ve tag aynı şeydir.

http://svnbook.red-bean.com/en/1.7/svn.branchmerge.tags.html adresinden alıntı:

"But wait a moment: isn't this tag creation procedure the same procedure we used to create a branch? Yes, in fact, it is. In Subversion, there's no difference between a tag and a branch. Both are just ordinary directories that are created by copying. Just as with branches, the only reason a copied directory is a tag is because humans have decided to treat it that way: as long as nobody ever commits to the directory, it forever remains a snapshot. If people start committing to it, it becomes a branch."

Yani svn derki. tag ve branch insanların kafasındaki bir olgudur. Benim için farketmez. Eğer birisi gider tag'ı checkout edip orada geliştirme yapmaya kalkarsa yapabilir. Ama bu artık tag olmaktan çıkar, branch olur ;)

Peki ne diye tags ve branch tanımları var diyeceksiniz? Var çünkü CVS denilen eski sürüm kontrol sisteminde bu iki farklı anlama geliyordu. SVN(Subversion) da ise durum yukarıdaki gibi değişti.