2009-11-29 22 views
20

Za każdym razem, gdy widzę konflikt w czymś podobnym do importu lub zmian w metodzie podpisu (np. Zmiany nazw zmiennych) w moim SCM, zastanawiam się, czy istnieje coś takiego, jak w przypadku świadomej językowo metody porównywania/scalania, która może obsłużyć bardziej irytujące małe zmiany, które mogą się zdarzyć we wspólnym projekcie. Czy jest coś, co zapewnia bardziej płynne konflikty, działające w środowisku Unix?Komenda obsługująca Java Merge

+2

Dobry pomysł. Brzmi jak koncepcja twojego następnego projektu open source :) – Asaph

+0

Cóż, przypadki "low hanging fruit" są tak łatwe, że wciąż wierzę, że ktoś musiał pomyśleć o tym bevore, że zaczynam to pytanie. – Marcus

+0

Wygląda na dupę dla http://stackoverflow.com/questions/523307/semantic-diff-utilities – Marcus

Odpowiedz

5

Zgadzam się, że byłoby wspaniale, gdyby takie narzędzie istniało, ale nie znam nikogo, kogo znam. Powodem, dla którego uważam, że ich nie ma, jest to, że algorytm scalania dla każdego SCM (czy to git, hg, bzr, svn itd.) Działa na najniższym wspólnym mianowniku, który jest po prostu zwykłym tekstem. Dla tych narzędzi SCM, aby naprawdę zrozumieć składnię języka i semantykę, musiałyby zawierać zdolność do parsowania języka. Wydaje się, że jest to po prostu zbyt duże zadanie dla każdego SCM, aby włączyć możliwość analizowania Java, C#, Python, Ruby, Groovy, C, C++, itp., Nie wspominając, że każdy z tych języków ma różne składnie między wersjami (np. generics Java nie istniała do 1.5). Tak więc SCM musiałby zawierać możliwość wykrywania lub konfigurowania, aby wiedzieć, jaki język i wersja języka jest zapisana w kodzie źródłowym.

Myślę, że byłoby bardziej prawdopodobne, że dowolna zależna od języka funkcja scalania można znaleźć w narzędziu scalającym innej firmy (np. scalanie> ustawienie narzędzia w .gitconfig i ustawienie interfejsu ui> merge w .hgrc). To narzędzie można skonfigurować tak, aby wiedziało, że wszystkie pliki .java w twoim projekcie są napisane w Javie 1.6, a następnie używają funkcji parsowania w JDK do generowania AST i przeprowadzają "głęboką" analizę, czy zmiana była znacząca w kontekście ten język.

+0

Tak, mam na myśli "polecenie scalania". Ale pytanie jest nadal, jeśli coś takiego jest. – Marcus

0

Możesz chcieć sprawdzić, czy wszyscy członkowie Twojego zespołu mają takie same ustawienia IDE, jak na przykład kolejność importu, formatowanie itp., Aby uniknąć takich konfliktów.

+0

To właściwie nie rozwiązuje problemu.Rozważmy na przykład trochę kodu Java "import a; import e;". Załóżmy, że dodaję "import b;" i dodajesz "import c;", oba w odpowiedniej kolejności alfabetycznej. Kiedy przychodzi czas na połączenie, otrzymamy konflikt scalający. Jeśli zgodzimy się umieścić import w kolejności alfabetycznej, nie ma dwuznaczności co do właściwego scalenia - ale narzędzia generują konflikty łączące, ponieważ nie znają konwencji kodowania. – Phil

+0

Najczęstsze niepowodzenie scalenia wydaje się, że każde dodanie kodu powoduje konflikty z każdym innym dodatkiem kodu w tym samym miejscu. Powinno być ogólne rozwiązanie tego "dodaj wszystkie rzeczy!" styl łączenia, który działa wystarczająco dobrze we wszystkich składniach. (Domyślnie włączenie wszystkich wstawień, jako domyślne scalenie, gdy scalanie odbywa się w określonym bloku lub zakresie). –

2

Szukam dokładnie tego samego. Ci dostawcy narzędzi scalających powinni prawdopodobnie odnieść się do tego semantycznego, świadomego językowo scalenia. Jeśli nie, będę musiał stać się jednym :)

Na razie, jako sztuczka dla biednego człowieka, czasami przetwarzam 3 pliki (podstawa, nasza, ich) do ich "formy kanonicznej" poprzez karmienie ich przez Eclipse's Code Cleanup/Organize Imports/Order Members.

Chociaż ograniczone, działa to ładnie: po raz ostatni zmniejszyło liczbę konfliktów do ~ 200 w 2. Planuję zawinąć to w skrypt i podłączyć do narzędzia scalania git.

Pisałem również autouzupełnianie konfliktów importu java skryptów, które po prostu przechowują obie strony importu i dodają komentarze, aby wyjaśnić, co się dzieje i co zrobić: "zorganizuj import".

+0

Jeśli chodzi o konflikty importu java, proponuję usunąć sporną sekcję importu (lub nawet cały import) i pozwolić, aby IDE ponownie je wstawił. Oczywiście musisz uzgodnić wspólne zamówienie importowe, aby to działało. Czasami import nie jest unikalny (np. Java.util.List vs. java.awt.List), ale przypadki bez oczywistego rozwiązania są dość rzadkie. * Właściwie istnieje lepsze rozwiązanie: usuń tylko markery konfliktów, pozostaw tam ewentualny duplikat importu, a na końcu IDE oczyść go. * – maaartinus

+0

Tak, to właśnie zrobiłem (odwołując się do "Napisałem również autoreportowanie konfliktów importowych java"). Dzięki za wyjaśnienie – inger

1

nie git rebase rozwiązać ten problem? wszelkie zmienne nazwy będą uwzględniane w powiązanych zatwierdzeniach. git rebase pozwala zachować synchronizację z wcześniejszymi zatwierdzeniami. tak długo, jak często zmieniasz bazę (codzienny?), nie powinieneś dostawać takich głupich konfliktów, a jeśli tak, to prawdopodobnie są to prawdziwe konflikty i nie można ich rozwiązać za pomocą parsera gramatyki języka Java.