SVN depoları arası dizin taşımak

SVN sürüm kontrol sisteminde bir dizinin kopyasını almak ya da taşımak istediğinizde, bunu svn cp ve svn mv komutları ile yapabiliyorsunuz.

Basitçe svn add ile sıfırdan eklemekten önemli bir farkı var bunun; SVN tarihçesini kaybetmiyorsunuz, geçmişe aynen bakabiliyorsunuz.

Ne yazık ki svn cp/mv komutları, depolar arası taşımacılık hizmeti vermiyor. Bir depodan diğerine bir dizini ya da deponun tamamını tarihçesi ile beraber taşımak isterseniz, bunun için SVN sunucu üzerinde svnadmin komutuyla doğrudan depolara erişmemiz gerekiyor.


svnadmin dump tasinacak_deponun_tam_yolu > /root/tasinacak_depo.dump

komutuyla deponun dökümünü aldık. İçinde tüm revizyonlar da var. Aldık almasına da, tüm depoyu değil de, sadece içinden sadece bir dizini aktarmak istiyorsak, burada bir temizlik yapmamız gerekiyor. İşte o noktada imdadımızı svndumpfilter komutu yetişiyor.


svndumpfilter include --drop-empty-revs --renumber-revs tasinacak_dizin_adi < /root/tasinacak_depo.dump > /root/tasinacak_dizin.dump

Bu komut içinde dizin_adi geçmeyen revizyonları temizliyor, temizlerken de –drop-empty-revs ile arada aktarılmayan revizyon numaralarını siliyor, –renumber-revs ile de tekrar numaralandırıyor. Eğer tüm depoyu doğrudan taşıyacaksanız, bu adımı atlayabilirsiniz.

Sonunda oluşan dosyayı da, yeni depoya aktarıyoruz:


svnadmin load yeni_deponun_dosya_sistemindeki_tam_yolu < /root/tasinacak_dizin.dump

Bu komut dump’taki revizyonları tek tek okuyup, yeni depoya sanki sıfırdan yeni bir revizyonmuş gibi işliyor.

Elbette bu işlemler sırasında tarihçeyi olmasa bile, revizyon numaralarını kaybediyoruz. Çünkü eski depodaki 234 numaralı revizyonu, yeni depoda da halihazırda aynı revizyon numarasına sahip bir işlem olduğu için korumak mümkün değil. Sırada kaç numra varsa, örneğin 48727 gibi bir revizyon numarası alabiliyor.

Genellikle bu bir sorun yaratmıyor ama eğer eski revizyon numaralarını kullanarak bağlantı verilmiş iş takip sistemi gibi bir uygulama varsa, revizyon numaralarını doğrudan çöpe atmak istemeyebiliriz. O zaman svnadmin load komutunun çıktısını ayrıştırarak, bir tablo oluşturarak hangi revizyonun neye karşılık geldiğinin bir tablosunu oluşturmak ve ona göre iş takip sistemindeki bilgileri de güncellemek mümkün.

Bu işlemleri yapmak için sunucuya erişiminiz yoksa, çareler tükenmez, o zaman SVN deposu yansılamak için devreye soktuğumuz svnsync komutu imdadımıza yetişecektir.