2009-11-29 13 views
20

benim SCM ithalat veya yöntem imzası değişiklikleri (örneğin değişkenlerin adlandırır) gibi bir şey üzerinde bir çatışma görsem ben daha sinir bozucu işleyebilir bir dil farkında diff/birleştirme yöntemi gibi bir şey varsa acaba Paylaşılan bir projede olabilecek küçük değişiklikler. Unix ortamında çalışarak anlaşmazlıkları daha sorunsuz işleyen bir şey var mı?Java farkında birleştirme komutu

+2

İyi fikir. Bir sonraki açık kaynak projeniz için konsept gibi geliyor :) – Asaph

+0

Eh, "düşük asılı meyve" vakaları o kadar kolay ki hala birinin bu konuya başladığına inanıyorum. – Marcus

+0

http://stackoverflow.com/questions/523307/semantic-diff-utilities – Marcus

cevap

5

Böyle bir araç varsa harika olacağını kabul ediyorum, ancak farkında olduğum hiçbir şey yok. Hiçbiri olmadığına inanıyorum çünkü her SCM için birleştirme algoritması (git, hg, bzr, svn, vb.), En basit ortak payda üzerinde çalışır. Bu SCM araçlarının dil sözdizimini ve anlambilimini gerçekten anlayabilmesi için, dili ayrıştırma yeteneğini içermeleri gerekir. Bu herhangi bir SCM için Java, C#, Python, Ruby, Groovy, C, C++, vb. Ayrıştırma yeteneğini içerecek şekilde çok büyük bir görev gibi görünüyor, bu dillerden her birinin sürüm arasında farklı sözdizimine sahip olduğundan bahsetmiyoruz (örneğin, Java jenerikleri 1.5'e kadar mevcut değildi). Bu nedenle, SCM, kaynak kodun hangi dilde yazıldığını ve hangi dilde yazılacağını tanımlayacak şekilde yapılandırılması veya yapılandırılması gerektiğini de dahil etmelidir.

Herhangi bir dile bağlı birleştirme özelliğinin daha olası olabileceğini düşünüyorum. 3. parti birleştirme aracında (örneğin .gitconfig'te birleştirme> araç ayarı ve uh> birleştirme ayarında .hgrc) bulunmalıdır. Bu araç, projenizdeki herhangi bir .java dosyasının Java 1.6'da yazıldığını ve daha sonra AST'u oluşturmak için JDK'daki ayrıştırma özelliklerini kullandığını ve değişimin içeriğinde anlamlı olup olmadığının bazı "derin" analizlerini gerçekleştirdiğini bilecek şekilde yapılandırılabilir. bu dil.

+0

Evet, "birleştirme komutu" ile kastediyorum. Ama soru şu ki böyle bir şey varsa. – Marcus

0
İlk etapta meydana gelen böyle çatışmaları önlemek için, vb, biçimlendirme, ithalatın sipariş gibi ekip paylaşımında şeyler için aynı IDE ayarlarını herkesi sahip içine bakmak isteyebilirsiniz

.

+0

Bu aslında sorunu çözmüyor.Örneğin, bazı Java kodlarını "import a; import e;" olarak düşünün. "İçe aktarma b" yi eklediğimi varsayalım ve her ikisini de uygun alfabetik sırayla "import c;" ekleyin. Birleşme zamanı geldiğinde, bir birleşme çatışması alacağız. Eğer ithalatı alfabetik sıraya koymayı kabul edersek, doğru kaynağın ne olduğu konusunda bir belirsizlik yoktur - ancak araçlar kodlama sözleşmelerinden haberdar olmadıkları için birleştirme çakışmaları oluştururlar. – Phil

+0

Birleştirmenin en yaygın hatası, herhangi bir kod eklemesinin, aynı noktada başka herhangi bir kod ekiyle çakışması gibi görünüyor. Bunun için genel bir çözüm olmalı "her şeyi ekle!" Birleştirme tarzı, tüm sözdiziminde yeterince iyi çalışır. (Birleştirme belirli bir satır veya aralıkta olduğunda varsayılan birleştirme olarak tüm eklemeleri dahil etmeye varsayılan). –

2

Aynı şeyi arıyorum. Bu birleştirme araçları satıcıları muhtemelen bu tür anlamsal, dil farkında birleştirme adresi olmalıdır. Eğer değilse, ben bir tane olmak zorunda kalacağım :)

Zayıf bir adamın hilesi olarak, bazen 3 dosyayı ön işlemden geçiriyorum (üssü, bizimkileri, onların “kanonik biçimine”, Eclipse'in Kodu Temizleme/Organize İhaleleri/Sipariş Üyeleri aracılığıyla beslenerek. Sınırlı olsa

, bu güzel çalışır: son kez bir komut dosyası içine sar, ve git en birleştirme aracına takmak için 2. Am planlama içine ~ 200 çatışmaların sayısını azalttı.

Ayrıca sadece ithalat hem tarafını tutar ve bittiğini ve hangi todo sebebini açıklamak için yorum ekler komut bakiyesi Autoresolve java ithalat çatışmaları, yazdım: 'ithalatı düzenlemek'.

+0

Java içe aktarma çakışmalarıyla ilgili olarak, çakışan içe aktarma bölümünü (hatta tüm içe aktarmaları) düşürmeyi ve IDE'nin bunları yeniden eklemesini öneririm. Bunun işe yaraması için ortak bir ithalat siparişinde anlaşmanız gerekir. Bazen ithalatlar benzersiz değildir (örn. Java.util.List vs. java.awt.List), ancak bariz bir çözüm bulunmayan vakalar oldukça nadirdir. * Aslında, daha iyi bir çözüm var: Yalnızca çakışma işaretleyicilerini kaldırın, muhtemelen çoğaltılmış ithalatları bırakın ve sonunda IDE'yi temizleyin. * – maaartinus

+0

Evet, yaptığım şey buydu ("Ayrıca," java içe aktarma çakışmalarını otomatikleştir "). Yine de açıkladığın için teşekkürler – inger

1

bu sorunu çözmeyerek gidermek değil mi? herhangi bir değişken adı, ilişkili işlemlerde dikkate alınacaktır. git rebase, upstream taahhütleri ile senkronize kalmanızı sağlar. sık sık yeniden israf ettiğiniz sürece (günlük ish?) böyle aptalca çatışmalar yapmamalısınız, ve eğer öyleyseniz, muhtemelen gerçek çatışmalardır ve bir java dilbilgisi çözümleyicisi tarafından çözülemezler.