Subversion'da neden ağaç çatışmaları yaşıyorum?


353

Bagajımın bir özellik dalı vardı ve periyodik olarak bagajımdan şubemdeki değişiklikleri birleştiriyordum ve her şey iyi çalışıyordu. Bugün şubeyi tekrar gövdeye birleştirmeye gittim ve şubemin oluşturulmasından sonra gövdeme eklenen dosyalar "ağaç çatışması" olarak işaretlendi. Gelecekte bundan kaçınmanın bir yolu var mı?

Bunların düzgün bir şekilde işaretlendiğini sanmıyorum.


Boş bir depodan başlayarak bu sorunu yeniden oluşturmak için bir reçete verebilir misiniz?
Wim Coenen

Bugün yeni bir repo yapmak ve bunu test etmek ve aynı sonuçları almak ve geri göndermek için biraz zaman bulacağım. Teşekkürler.
Greg

Yanıtlar:


399

Gary'nin verdiği bağlantıyı okuyan bir çözüm buldum (ve bu yolu izlemenizi öneririm).

SVN istemcisi 1.6.x ile çalışma dizininizi işleyen ağaç çakışmasını gidermek için özetleme :

svn resolve --accept working -R .

nerede .çatışma dizinidir.

UYARI : "Çalışma dizininizin taahhüdü", korumalı alan yapınızın yürüttüğünüz yapı olacağı anlamına gelir; bu nedenle, örneğin, korumalı alanınızdan bir dosyayı sildiğinizde depodan da silinir. Bu yalnızca çakışan dizine uygulanır.

Bu şekilde, SVN'nin geçerli dizinden ( ) başlayarak korumalı --resolvealanınızı ( --accept working) çalışma alanınızdaki ( ), yinelemeli olarak ( -R) kabul ederek çakışmayı ( ) çözmesini öneriyoruz ..

TortoiseSVN'de, sağ tıklamayla "Çözüldü" seçilmesi bu sorunu çözer.


32
Bu şekilde, çatışmayı (--resolve) çözümlemeye svn için öneriyorsun yinelemeli, senin kum havuzu (--accept çalışma) içindeki (-R), geçerli dizinde fron başlayan HTH çalışma kopyasını kabul (.)
gicappa

22
TortoiseSvn'de, sağ tıklamayla "Çözüldü" seçilmesi bu sorunu çözer.
understack

40
bu sadece çalışan kopyayı körü körüne kabul etmiyor mu? Demek istediğim, bu çatışmalarla ilgili sorunların nerede olduğunu söyleyemediğimi hissediyorum, ama sadece çalışmayı çözüp kabul edersem, bu sadece diğer insanların çalışmalarını silmeyecek mi?
Parris

10
Bu durumun bir nedeni, svn rm'dartık gerekli olmadığını düşündüğünüz bir dizinin olması olabilir , ancak başka biri gereken yeni bir dosya ekleyebilir. Çalışan kopyanızı güncellediğinizde bir ağaç çakışması olması gerekir. Çözümünüzü körü körüne kabul ediyorsanız (dizini siliyorsanız), o kişinin dosyasını kaldırırsınız. Sihirli "doğru olanı yap" düğmesi yoktur. Ne yaptığınızı, neden en son sürümle çakıştığını ve bunu nasıl doğru bir şekilde çözeceğinizi anlamalısınız.
bambams

5
@TWiStErRob, bu semptomun SVN'de bir sürüm kontrol aracı olarak ortaya çıkan sorunların göstergesi olduğunu iddia ediyorum. Şahsen, gelecekte bu konuyu 'önlemenin' yolu kullanmak olacaktır git. Bu muhtemelen asker için pratik bir seçenek olmadığından, bu cevabın açıkladığı gibi durumla uğraşmak en iyi seçenektir.
Jess Telford

59

Subversion 1.6, dizin düzeyindeki çakışmaları kapsayacak şekilde Ağaç Çakışmaları ekledi. Bir dosyayı yerel olarak sildiğinizde, bir güncelleme o dosyada bir metin değişikliğini azaltmaya çalışırken iyi bir örnek olabilir. Diğeri ise, bir Ekle / Sil eylemi olduğu için düzenlediğiniz bir dosyanın alt adının yeniden adlandırılmasıdır.

CollabNet'in Subversion Blogunda Tree Conflicts hakkında harika bir makale var .


9
Verdiğiniz bu örneklerin hiçbiri benim durumumla ilgili değil. Belki de açıklamam net değil mi?
Greg

33

Deneyimlerime göre, SVN bir klasörü sildiğimde bir ağaç çakışması oluşturur. Sebebi yok gibi.

Kodum üzerinde çalışan tek kişi benim -> bir dizini sil -> taahhüt -> çatışma!

Git'e geçmek için sabırsızlanıyorum .

Açıklığa kavuşturmalıyım - Subclipse kullanıyorum . Muhtemelen sorun budur! Yine geçiş yapmak için sabırsızlanıyorum ...


2
SVN komut satırı istemcisinden de aynı sorun, bu yüzden Eclipse değil.
dolmen

3
NetBeans ve SVN ile aynı sorun var. Dizini sil -> çakışma.
Gruber

2
Burada aynı sorun ... çok çok can sıkıcı ... GERİ
DÖNMEK

1
Ağaç çatışmalarında IntelliJ Idea ile harika bir numara keşfettim. Tüm değişikliklerimi rafa alıyorum (bu, değişikliklerimin bir yamasını oluşturmak ve sonra geri almakla aynı şeydir). Sonra Subversion'dan en son değişiklikleri almak için bir svn güncellemesi yapıyorum. Bundan sonra değişikliklerimi kaldırıyorum (yamayı uygulamakla aynı) ve viyola!
ehrhardt

1
Assembla depolarına karşı Ubuntu 12.04.4 LTS üzerinde svn istemcisi 1.7.9 kullanarak aynı sorunu var gibi görünüyor.
siliconrockstar

28

Bunun size olup olmadığını bilmiyorum, ancak bazen birleştirmek için yanlış dizini seçiyorum ve tüm dosyalar tamamen iyi görünse bile bu hatayı alıyorum.

Misal:

Birleştirme / svn / Proje / şube / bazı şube / Kaynaklar / svn / Project / trunk ---> Ağaç çakışması

/ Svn / Project / branch / bazı dalını / svn / Project / trunk ile birleştir>> Tamam

Bu aptalca bir hata olabilir, ancak her zaman açık değildir, çünkü bunun daha karmaşık bir şey olduğunu düşünüyorsunuz.


17

Burada olan şu: Bagajınızda yeni bir dosya oluşturuyorsunuz, daha sonra onu şubenizde birleştiriyorsunuz. Birleştirme taahhüdünde bu dosya şubenizde de oluşturulacaktır.

Şubenizi yeniden gövdeye birleştirdiğinizde, SVN aynı şeyi tekrar yapmaya çalışır: Şubenizde bir dosya oluşturulduğunu görür ve birleştirme işleminde bagajınızda oluşturmaya çalışır, ancak zaten var! Bu bir ağaç çatışması yaratır.

Bundan kaçınmanın yolu, özel bir birleştirme, yeniden bütünleşme yapmaktır . Bunu --reintegrateanahtarla yapabilirsiniz.

Bu konuyu dokümantasyonda okuyabilirsiniz: http://svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.reintegrate

Bununla birlikte, dalınızı gövdeye geri birleştirirken, temeldeki matematik oldukça farklıdır. Özellik dalınız artık hem yinelenen gövde değişikliklerinin hem de özel şube değişikliklerinin bir karışımıdır, bu nedenle kopyalanacak basit bitişik düzeltmeler aralığı yoktur. --Reintegrate seçeneğini belirterek Subversion'dan yalnızca dalınıza özgü değişiklikleri dikkatlice çoğaltmasını istersiniz. (Aslında bunu, en son gövde ağacını en son şube ağacı ile karşılaştırarak yapar: ortaya çıkan fark tam olarak sizin şube değişikliklerinizdir!)

Bir dalı yeniden entegre ettikten sonra, onu kaldırmanız şiddetle tavsiye edilir, aksi takdirde diğer yönde birleştiğinizde ağaç çatışmaları almaya devam edersiniz: bagajdan dalınıza. (Daha önce açıklananla aynı nedenden dolayı.)

Bunun da bir yolu var, ama hiç denemedim. Bu yazıda okuyabilirsiniz: Subversion şube v1.6 yeniden entegrasyonu


1
--reintegrateSubversion 1.8'de seçenek kullanımdan kaldırıldığı için indirildi . SVN 1.8'den başlayarak bu tür birleşmeler otomatiktir!
bahrep

8
Birçok kişi hala yıkım <1.8 kullandığından çünkü seçildi
juacala

Cevap için SVN sürüm bilgilerinin eklenmesinin uygun olacağını düşünüyorum.
Peter Mortensen

1
1.8 burada ve bu çözüm olmadan işe yaramaz.
Kış

Bu, neden bunun olduğu sorusuna cevap verdiği için oylandı.
Joshua Breeden

7

Bu, her yerde aynı sürüm istemcilerinin kullanılmamasından kaynaklanabilir.

Sürüm 1.5 istemcisi ve sürüm 1.6 istemcisini aynı depoya doğru kullanmak bu tür bir sorun yaratabilir. (Kendimi ısırdım.)


4

Dosyanın yakınında hiçbir yerde düzenleme / silme / gelmediğiniz için mantıklı olmayan ağaç çakışmalarıyla karşılaşırsanız, birleştirme komutunda bir hata olması da iyi bir olasılıktır.

Olabilecek olan, daha önce mevcut birleştirmenize dahil ettiğiniz bir sürü değişikliği önceden birleştirmiş olmanızdır. Örneğin, bagajda birisi bir dosyayı düzenledi ve daha sonra yeniden adlandırdı. İlk birleştirme işleminizde düzenlemeyi dahil ederseniz ve ikinci bir birleştirme işleminde hem düzenleme hem de yeniden adlandırma (esasen kaldırma) içeriyorsa, size bir ağaç çakışması da verir. Bunun nedeni, önceden birleştirilmiş düzenlemenin kendiniz gibi görünmesi ve kaldırmanın otomatik olarak gerçekleştirilmemesidir.

Bu en azından 1.4 depolarda meydana gelebilir, 1.5'te sunulan birleştirmenin burada yardımcı olup olmadığından emin değilim.


2

Bugüne kadar, en az 3 ay öncesinden beri, bir dalı gövdede birleştirmeye çalışırken yüzlerce ağaç çatışmasıyla düzenli olarak karşılaştım ( TortoiseSVN 1.11'i kullanarak ). Basılı olsun veya olmasın, BTW. TortoiseSVN'yi 2004'teki v1'den beri kullanıyorum ve dalları her zaman yeniden entegre ediyordum. Sanırım son zamanlarda bir şeyler olmuş olmalı?

Bugün bu basit deneyi yaptım ve şu çılgın çatışmaları yaratan şeyi buldum:

  1. 393'teki bagajı çıkardım;
  2. Yeni dosyaları oluşturmanın yanı sıra onlarca dosyayı rastgele değiştirdim;
  3. Karar verdim. Şimdi @ 395 (bir meslektaş kendi eşyalarını yapmak için 394'te çatallandı).
  4. Sonra şubeyi gövdeye yeniden entegre etmeye çalıştım, sadece test ettim; TortoiseSVN'nin sihirbazdaki önerisini izleyerek: "tüm düzeltmeleri birleştirmek (yeniden bütünleştirmek) için bu kutuyu boş bırakın". Bunu başarmak için, gövde klasörünü sağ tıklatıp "TortoiseSVN> Birleştir, / path / to / branch" ı seçtim ve iletişim kutusunda önerildiği gibi devir aralığını boş bıraktım .

Tartışma: (eke bakınız)

neyin tüm revizyonları ...? Küçük bildiğim yaptım istemci atıfta olması gerektiğini " hedefin tüm revizyonları! (Gövde)" olarak, bu kolu yeniden entegre sürecinde, ben "birleştirme Düzeltmeler 1-HEAD" söz gördük! AMAN TANRIM. Zavallı Şeytan, burada ölümüne düşüyorsun. Bu şube 393'te doğdu, Tanrı aşkına doğum belgesini okuyamıyor musun?bu yüzden bu kadar çok çatışma meydana geldi: SVN-cli revizyon 1'den aptalca bir çılgınlık sürüyor

Çözüm:

  1. Wiz tarafından tavsiye edilenin aksine, şubenin hayatının TÜM revizyonlarını kapsayan bir aralık belirtin! bu nedenle, 394-HEAD ;
  2. şimdi birleştirme testini tekrar yap ve bir puro al. ( ikinci eke bakınız).

Ahlaki: Bu hatayı neden hala düzeltmediklerini anlayamıyorum, çünkü bu bir, üzgünüm. Bunu onlara bildirmek için zaman ayırmalıyım.


1

Bu sorunla bugün de karşılaştım, ancak benim özel sorunum muhtemelen seninle ilgili değil. Dosya listesini inceledikten sonra ne yaptığımı anladım - geçici olarak bir derlemede başka bir derlemeden bir dosya kullanıyordum. Çok fazla değişiklik yaptım ve SVN geçmişini yetim bırakmak istemedim, bu yüzden şubemde dosyayı diğer montajın klasöründen taşıdım. Bu SVN tarafından izlenmez, bu nedenle dosya silinir ve yeniden eklenir gibi görünür. Bu bir ağaç çatışmasına neden olur.

Dosyayı geri taşıyarak, taahhüt ederek ve daha sonra şubemi birleştirerek sorunu çözdüm . Sonra dosyayı geri taşıdım. :) Bu hile gibi görünüyordu.


1

Benzer bir sorun yaşadım. Benim için gerçekten işe yarayan tek şey, çakışan alt dizinleri ile silmekti:

svn delete --force ./SUB_DIR_NAME

Ardından, bunları içeren çalışma kopyasında başka bir kök dizinden yeniden kopyalayın:

svn copy ROOT_DIR_NAME/SUB_DIR_NAME

Sonra yap

svn cleanup

ve

svn add *

Sonuncuyla ilgili uyarılar alabilirsiniz, ancak onları görmezden gelin ve son olarak

svn ci .

0

Aynı sorunu yaşadım ve bu talimatları kullanarak birleştirmeyi yeniden yaparak sorunu çözdüm . Temel olarak, trunktarih ve ağaç çakışmaları hakkında çok fazla uğraşmadan SVN'nin "2 URL birleştirme" özelliğini şubenizin geçerli durumunu güncellemek için kullanır . Beni 114 ağaç çakışmasını elle düzeltmekten kurtardı.

Tarihi olduğu kadar iyi koruyor mu emin değilim, ama benim durumumda buna değdi.


5
Tarih neden VCS kullanıyoruz ... yoksa bir şey mi kaçırıyorum?
TWiStErRob

0

Bazen karşılaştığım bir senaryo:

Serbest bırakma dalı oluşturduğunuz bir bagajınız olduğunu varsayın. Bagajdaki bazı değişikliklerden sonra (özellikle "some-dir" dizini oluşturmak), daha sonra sürüm dalında da birleştirilmesini istediğiniz bir özellik / düzeltme dalı oluşturursunuz (değişiklikler yeterince küçük olduğundan ve özellik / düzeltme, sürüm için önemlidir) .

trunk -- ... -- create "some-dir" -- ...
     \                                  \-feature/fix branch
      \- release branch

Daha sonra, özellik / düzeltme dalını doğrudan yayın dalına birleştirmeye çalışırsanız, bir ağaç çakışması elde edersiniz (dizin özellik / düzeltme dalında bile mevcut olmasa bile):

svn status
!     C some-dir
      >   local missing or deleted or moved away, incoming file edit upon merge

Bu nedenle, özellik / düzeltme dalını birleştirmeden önce "some-dir" dizinini oluşturan özellik / düzeltme dalını oluşturmadan önce bagajda yapılan taahhütleri açıkça birleştirmeniz gerekir.

Git'te bu gerekli olmadığından sık sık unutuyorum.

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.