2009-11-29 19 views
20

Mỗi khi tôi thấy xung đột về thứ gì đó như nhập khẩu hoặc thay đổi chữ ký phương thức (ví dụ: đổi tên biến) trong SCM của tôi, tôi tự hỏi có điều gì giống như phương pháp nhận biết ngôn ngữ khác. những thay đổi nhỏ có thể xảy ra trên một dự án được chia sẻ. Có điều gì ngoài kia xử lý xung đột thuận lợi hơn, làm việc trong môi trường Unix không?Lệnh kết hợp nhận biết Java

+2

Ý tưởng hay. Âm thanh như khái niệm cho dự án mã nguồn mở tiếp theo của bạn :) – Asaph

+0

Vâng, trường hợp "quả treo thấp" rất dễ dàng đến mức tôi vẫn tin rằng ai đó phải nghĩ về bevore đó tôi bắt đầu câu hỏi này. – Marcus

+0

Dường như là một sự lừa đảo cho http://stackoverflow.com/questions/523307/semantic-diff-utilities – Marcus

Trả lời

5

Tôi đồng ý rằng sẽ thật tuyệt vời nếu một công cụ như vậy tồn tại, nhưng không có công cụ nào tôi biết. Lý do tôi tin rằng không có gì là bởi vì thuật toán kết hợp cho mỗi SCM (cho dù đó là git, hg, bzr, svn, vv) hoạt động trên mẫu số chung thấp nhất, mà chỉ đơn giản là văn bản thuần túy. Để các công cụ SCM này thực sự hiểu cú pháp và ngữ nghĩa ngôn ngữ, chúng sẽ phải bao gồm khả năng phân tích cú pháp ngôn ngữ. Dường như đây chỉ là một nhiệm vụ quá lớn đối với bất kỳ SCM nào bao gồm khả năng phân tích cú pháp Java, C#, Python, Ruby, Groovy, C, C++, v.v., chưa kể rằng mỗi ngôn ngữ này có các cú pháp khác nhau giữa các phiên bản (ví dụ: Generics Java không tồn tại cho đến 1.5). Vì vậy, SCM sẽ phải bao gồm khả năng phát hiện hoặc được định cấu hình để biết ngôn ngữ và phiên bản ngôn ngữ mà mã nguồn được viết.

Tôi nghĩ rằng sẽ có nhiều khả năng bất kỳ tính năng hợp nhất phụ thuộc vào ngôn ngữ nào sẽ được tìm thấy trong công cụ hợp nhất của bên thứ ba (ví dụ: cài đặt công cụ hợp nhất> trong .gitconfig và thiết lập phối> ui> trong .hgrc). Công cụ này có thể được cấu hình để biết rằng bất kỳ tệp .java nào trong dự án của bạn được viết bằng Java 1.6 và sau đó sử dụng các tính năng phân tích cú pháp trong JDK để tạo ra AST và thực hiện một số phân tích "sâu" cho dù thay đổi có ý nghĩa trong ngữ cảnh ngôn ngữ đó.

+0

Vâng, đó là ý tôi là "lệnh kết hợp". Nhưng câu hỏi vẫn là nếu có cái gì đó như thế. – Marcus

0

Bạn có thể muốn xem mọi người trong nhóm của bạn có cùng cài đặt IDE cho những thứ như thứ tự nhập, định dạng, v.v., để tránh xung đột như thế này xảy ra ngay từ đầu.

+0

Điều này không thực sự giải quyết vấn đề.Hãy xem xét ví dụ một số mã Java "import a; import e;". Giả sử tôi thêm "import b;" và bạn thêm "import c;", cả hai theo thứ tự chữ cái thích hợp. Khi đến lúc hợp nhất, chúng ta sẽ nhận được xung đột hợp nhất. Nếu chúng tôi đồng ý đặt hàng nhập khẩu theo thứ tự bảng chữ cái, thì không có sự mơ hồ về những gì hợp nhất là-- nhưng các công cụ tạo ra xung đột hợp nhất bởi vì họ không biết về các quy ước mã hóa. – Phil

+0

Sự thất bại phổ biến nhất để hợp nhất dường như bất kỳ sự bổ sung mã nào xung đột với bất kỳ sự bổ sung mã nào khác, tại cùng một vị trí. Nên có một giải pháp chung cho việc này "thêm tất cả mọi thứ!" phong cách hợp nhất, hoạt động tốt ở tất cả các cú pháp. (Mặc định bao gồm tất cả các chèn, như là một hợp nhất mặc định khi hợp nhất xảy ra trong một khối hoặc phạm vi nhất định.). –

2

Tôi đang tìm chính xác điều tương tự. Các nhà cung cấp công cụ hợp nhất này có lẽ nên giải quyết loại ngữ nghĩa sắp xếp theo ngôn ngữ này, nếu không, tôi sẽ phải trở thành một :)

Bây giờ, như một thủ thuật của người nghèo, tôi đôi khi xử lý trước 3 tệp. cơ bản, của chúng ta, của họ) đến 'dạng thức kinh điển' của họ bằng cách cho chúng ăn qua các Thành viên của Code Cleanup/Organize Imports/Order của Eclipse.

Mặc dù có giới hạn, tác phẩm này độc đáo: lần cuối cùng nó giảm số lượng xung đột xuống ~ 200 thành 2. Lập kế hoạch để bọc đoạn mã này vào một tập lệnh và cắm vào công cụ hợp nhất của git.

Cũng viết kịch bản tự động giải quyết xung đột nhập khẩu java, chỉ đơn giản giữ cả hai mặt của hàng nhập và thêm nhận xét để giải thích những gì đang diễn ra và cần làm gì: 'tổ chức nhập'.

+0

Liên quan đến xung đột nhập khẩu java, tôi khuyên bạn nên bỏ phần nhập xung đột (hoặc thậm chí tất cả các lần nhập) và để cho IDE chèn lại chúng. Bạn rõ ràng là cần phải đồng ý về một yêu cầu nhập khẩu chung cho việc này để làm việc. Đôi khi, nhập khẩu không phải là duy nhất (ví dụ: java.util.List so với java.awt.List), nhưng các trường hợp không có giải pháp rõ ràng là khá hiếm. * Trên thực tế, có một giải pháp tốt hơn: Loại bỏ các dấu xung đột chỉ, để lại có thể sao chép nhập khẩu ở đó, và để cho cuối cùng IDE làm sạch nó. * – maaartinus

+0

Vâng, đó là những gì tôi đã làm (đề cập đến "Đã viết kịch bản autoresolve java nhập khẩu xung đột"). Cảm ơn bạn đã làm rõ – inger

1

không git rebase giải quyết vấn đề này? bất kỳ đổi tên biến nào sẽ được tính trong các cam kết liên quan. git rebase cho phép bạn luôn đồng bộ với các cam kết ngược dòng. miễn là bạn rebase thường xuyên (hàng ngày ish?) bạn không nên nhận được xung đột ngu ngốc như thế, và nếu bạn đang có, họ có lẽ là xung đột thực sự và không thể giải quyết bằng một phân tích cú pháp ngữ pháp java.

Các vấn đề liên quan