svn: gövdesini şube ile değiştir


155

Bir yıkım havuzunun dallarından birini yeni sandık yapmanın en iyi yolu nedir?

Tüm sistem için büyük bir yeniden yazma yapıldı: işler taşındı, yeniden yazıldı, değiştirildi, kaldırıldı, yeniden adlandırıldı vb. Yeniden yazılmış kod test edildi ve eski bagajın yerini almaya hazır.

Temel olarak, eski ana hat (Trunk 5) etiketlenir ve burada sona erer. Yeniden yazılan şube (Şube 6) yeni ana hat (Gövde 7) olacaktır:

Bagaj (1) -> Bagaj (2) -> Bagaj (5) -> × + -> yeni Bagaj (7)
  \ \ |
  çatal birleştirme ???
    \ \ |
     + -> Şube (3) -> Şube (4) -> Şube (6) - +

Eski 'Bagajdan' devam eden tüm değişiklikler zaten 'Yeniden Yazılan dal'a dahil edilmiştir

Bunu nasıl yapabilirim?

Yanıtlar:


118

Eski gövdenin içeriğini başka bir yere taşımak için svn move komutunu kullanın ve daha sonra şubeyi gövdeye yeniden adlandırın.

Svn'de kopyalama ve taşıma işleminin dosya işlemleri gibi çalıştığını unutmayın. Bunları deponuzdaki dosyaları taşımak / kopyalamak için kullanabilirsiniz ve bu değişiklikler de sürümlendirilir. "Taşı" yı "kopyala + sil" olarak düşünün.

[EDIT] Nilbus, kullandığınızda birleşme anlaşmazlıkları alacağınızı bildirdi svn move.

Hala bunun doğru yaklaşım olduğunu düşünüyorum. Çatışmalara neden olur, ancak dikkatlice birleşirseniz, herhangi bir veri kaybetmeyeceksiniz. Bu sizi rahatsız ediyorsa Mercurial veya Git gibi daha iyi bir VCS kullanın .


1
Bunu yaparsanız, orijinal bagajda çalışan bir kopyada değişiklik yapan herkes, değişiklikleri birleştirilse bile bir çakışma yaşayacaktır. Bunun nedeni, dosyaların silinmesi ve yeniden eklenmesi - ayrı geçmişe sahip ayrı nesneler olarak ele alınmalarıdır.
Edward Anderson

@nilbus: Denedin mi? IIRC, SVN dosyaların silindiğini ve okunduğunu gösterir ancak dahili olarak dosyaların taşındığını bilecektir.
Aaron Digulla

Evet. İki kopyaya baktım. İlk kopyada A yönünü A2'ye ve B yönünü A'ya taşıdım, sonra A'yı B'ye, sonra A2'yi A'ya taşıdım (yeniden adlandırın ve yeniden adlandırın.) 2. kasada bir dosyada değişiklik yaptım ve svn yapmaya çalıştım Güncelleme. Değiştirdiğim dosya "silindi" nedeniyle çakıştı. Dahili olarak dosyaların yinelenen kopyalarını kaydetmez, ancak gördüğünüz Delete, çakışmalar söz konusu olduğunda sizi gerçekten etkiler.
Edward Anderson

12
@nilbus: Bu noktada, Linus Torvalds'tan alıntı yapmak istiyorum: "Bir süredir Subversion sloganı" CVS doğru yapıldı "ya da bunun gibi bir şeydi ve bu tür bir sloganla başlarsanız, hiçbir yerde yapamazsınız. CVS'yi doğru yapmanın bir yolu yok. "
Aaron Digulla

3
Evet. Katılıyorum. Bu sorunu çözmek için, aslında svn-git ile repo kontrol ettim ve git master'ı şube yeniden oluşturmak için git kullandım.
Edward Anderson

66

Bu hedefe ulaşmak için svn move komutunu kullanmayı kabul ediyorum.

Burada başkalarının sıra dışı olduğunu düşündüklerini biliyorum, ama bunu bu şekilde yapmayı seviyorum. Bir özellik dalına sahip olduğumda ve önemli ölçüde değiştirilmiş bir bagajla birleştirmeye hazır olduğumda, genellikle adlandırılmış yeni bir dalla birleştireceğim <FeatureBranchName>-Merged. Sonra çakışmaları çözer ve birleştirilmiş kodu test ederim. Tamamlandığında, bagajı etiketler klasörüne taşıyorum, böylece hiçbir şey kaybetmiyorum. Son olarak benim <FeatureBranchName>-Mergedbagajıma taşıyorum.

Ayrıca hamleleri yaparken çalışan kopyadan kaçınmayı tercih ederim, burada komut örnekleri:

svn move https://SVNUrl/svn/Repo/trunk https://SVNUrl/svn/Repo/tags/AnyName

svn move https://SVNUrl/svn/Repo/branches/BranchName-Merged https://SVNUrl/svn/Repo/trunk

Not: 1.5 kullanıyorum


1
Bu en iyi uygulama olmayabilir, ancak çok eski bir gövdeye sahip olduğunuzda ve herkes bir dalda gövdeymiş gibi çalıştığında kesinlikle en etkilidir. Sorunumu çözdü!
Alex Perrin

12

Son zamanlarda bu soruna bakıyordum ve çok mutlu olduğum çözüm

svn merge --ignore-soy trunk-url şube-url

bagajımın çalışma kopyası üzerinde.

Bu, değişiklikleri tarihsel bir şekilde uygulamaya çalışmaz (bagajdaki değişiklikleri koruyarak). Sadece gövde ve dal arasındaki "farkı uygular". Bu, değiştirilmemiş dosyalarda kullanıcılarınız için herhangi bir çakışma oluşturmaz. Bununla birlikte, Geçmiş bilgilerinizi şubeden kaybedersiniz, ancak yine de bir birleştirme gerçekleştirdiğinizde olur.


1
Post svn 1.5, geçmişi koruyan birleştirme yapabilmelisiniz.
NSherwin

9

Bu değişiklikleri depo tarayıcı aracıyla yapmanızı öneririz.

Çalışma kopyası aracılığıyla büyük silme + taşıma işlemlerini denemek, çalışma kopyasını öldürmenin harika bir yoludur. Çalışma kopyasını kullanmak zorunda kalırsanız, her silme veya taşıma işleminden sonra artımlı taahhütler gerçekleştirin ve her taahhütten sonra çalışma kopyanızı GÜNCELLEYİN.


Repo bağlantısı kullanışlı olacaktır (sadece kolaylık sağlamak için - bir google aramasını kaydedin :))
Brian M. Hunt

3
Afedersiniz. Yazım, belirli bir araca (düzenlenmiş) atıfta bulunduğumu gösterdi. Aslında, çoğu SVN GUI aracı bir depo tarayıcı özelliğine sahip olmalıdır. FYI: Tortoise tortoisesvn.tigris.org kullanıyorum
Chris Nava

4

Şubeyi yeni bagaj yapmak istiyorsanız (yani) dal oluşturulduğundan bu yana yapılan tüm değişikliklerden kurtulursanız, 1 yapabilirsiniz. Bagajın dalını oluşturun (yedekleme amacıyla) 2. "değişiklikleri geri alma msgstr "" (şube oluşturulduktan sonra tüm düzeltmeleri seçin 3. Şubeyi yeniden gövdeye birleştirin.

Tarih bu şekilde kalmalı.

Saygılarımızla, Roger


3

@Aaron Digulla ve @kementeus çözümleri uygulanabilir. Subversion 1.4 depoları için, kopyalama / taşıma işlemleri farklı bir depo yapısına veya depoları bölmeye ilerlemeyi zorlaştırabilir.

1.5'in geliştirmelerinin, taşıma / kopyalama geçmişinin daha iyi çözümlenmesini içerdiğine inanıyorum, bu yüzden muhtemelen 1.5 deposu için bir sorun olmayacaktır.

1.4 veri havuzu için, mevcut bagajın başka bir yerde hareketini svnadmin dumpve svndumpfiltergerçekleştirilmesini, sonra da şubeyi aynı mekanizma ile gövdeye taşımanızı tavsiye ederim . İki döküm dosyasını test havuzuna yükleyin, doğrulayın ve üretime taşıyın.

Tabii ki, başlamadan önce mevcut havuzunuzu yedekleyin.

Bu, taşıma / kopyayı açıkça kaydetmeden geçmişi korur ve gelecekteki yeniden düzenlemeyi, geçmişi korumayı kolaylaştırır.


Düzenleme: İstendiği gibi, 1.4 Red-Bean kitabından, Filtreleme Havuz Geçmişinden gelen 1.4 davranışının belgeleri

Ayrıca, kopyalanan yollar size biraz sorun verebilir. Subversion, depodaki kopyalama işlemlerini destekler; burada varolan bazı yollar kopyalanarak yeni bir yol oluşturulur. Deponuzun kullanım ömrünün bir noktasında, bir dosyayı veya dizini svndumpfilter, hariç tutulan bir konumdan dahil olduğu bir konuma kopyalamış olabilirsiniz . Döküm verilerinin kendi kendine yeterli olmasını sağlamak için,svndumpfilterkopya tarafından oluşturulan dosyaların içeriği de dahil olmak üzere yeni yolun eklenmesini göstermesi ve filtrelenmiş döküm veri akışınızda bulunmayacak bir kaynaktan kopya olarak gösterilmemesi gerekir. Ancak Subversion depo dökümü biçimi yalnızca her revizyonda nelerin değiştiğini gösterdiğinden, kopyalama kaynağının içeriği kolayca bulunmayabilir. Deponuzda bu tür kopyaların bulunduğundan şüpheleniyorsanız, dahil edilen / hariç tutulan yol kümenizi, belki de sorunlu kopyalama işlemlerinizin kaynağı olarak görev yapan yolları da dahil olmak üzere yeniden düşünmek isteyebilirsiniz.

Bu, kullanan göçler / yeniden düzenlemeler için geçerlidir svndumpfilter. Artık biraz fazladan çalışmanın daha sonra çok fazla işten tasarruf sağlayabileceği zamanlar vardır ve svndumpfiltergelecekteki göçler / yeniden düzenlemeler için kullanılabilir olan kolay kullanımı koruyarak riski nispeten düşük maliyetle azaltır.


Neden "svn move" yeterli olmaz? Önerin balyozla sinek ezmek gibi görünüyor.
Rob Williams

Bu 1.4 davranıştan ısırıldım - eğer bir SVN deposu dizinlerin veya dalın / etiketlerin hareketlerini (yeniden adlandırır) içeriyorsa, svndumpfilter kullanımı, bir depoyu yeniden yapılandırmaya / yeni bir yapıya geçirmeye yardımcı olmak için başarısız olabilir, çünkü geçmişi işlemez iyi. Belgelenmiştir, referansı kazacağım. isterseniz
Ken Gentle

Bu davranışa başvuru ekleyebilir misiniz?
Jacco

2

Yukarıdaki cevaplar işe yarayacak olsa da, en iyi uygulama değildir. En son svn sunucusu ve istemci yolu sizin için birleşir. Yani svn hangi revizyonları bir şubeye ve nereden birleştirdiğinizi biliyor. Bu, bir dalı güncel tutarken ve daha sonra bagajda yeniden birleştirirken çok yardımcı olur.

Bununla birlikte, Subversion'un hangi sürümünü kullanırsanız kullanın, bir daldaki değişiklikleri yeniden gövdeye almak için en iyi uygulama yöntemi vardır. Subversion kılavuzunda özetlenmiştir: Subversion ile Sürüm Kontrolü, Bölüm 4. Dallanma ve Birleştirme, Bir Dalın Senkronize Olması .


Resmi bilgi için teşekkürler, böylece resmi yaklaşımla gövdeye şube birleştirebilirsiniz. Anahtar kelime yeniden bütünleşir
Junyo

-3

SVN'de gerçekten garip / olağandışı bir konfigürasyon, hatta yine de "iyi bir uygulama" olmaktan çok uzak olduğunu düşünüyorum, sanırım şöyle bir şey yapabilirsiniz:

  • Tüm kaynaklara göz at (svn co therootsourcetree)
  • Bagajı çıkarın (svn rm trunk)
  • Dalın gövdeye kopyalanması (svn cp dalları / thebranch / trunk)
  • Dalın kaldırılması (svn rm şubeleri / thebranch)
  • Değişiklikleri yap

İyi şanslar


9
Bu, "svn move" tarafından korunacak tarihin izini yok eder.
Rob Williams
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.