2010-10-26 57 views
29

Thường có xung đột trong tệp dự án Xcode (Project.xcodeproj/project.pbxproj) khi hợp nhất các nhánh (tôi đang sử dụng git). Đôi khi nó dễ dàng, nhưng đôi khi tôi kết thúc với một tập tin dự án tham nhũng và phải hoàn nguyên. Trong trường hợp xấu nhất, tôi phải sửa chữa tệp dự án theo cách thủ công trong lần commit thứ hai (có thể bị đè bẹp với lần trước) bằng cách kéo vào các tệp, v.v.Hợp nhất các tệp dự án Xcode

Có ai có lời khuyên về cách xử lý xung đột hợp nhất lớn và phức tạp tệp như tệp dự án Xcode?


EDIT-- Một số câu hỏi liên quan:

Git and pbxproj

Should I merge .pbxproj files with git using merge=union?

NGUỒN:

http://www.alphaworks.ibm.com/tech/xmldiffmerge

http://www2.informatik.hu-berlin.de/~obecker/XSLT/#merge

http://tdm.berlios.de/3dm/doc/thesis.pdf

http://www.cs.hut.fi/~ctl/3dm/

http://el4j.svn.sourceforge.net/viewvc/el4j/trunk/el4j/framework/modules/xml_merge/

+0

Câu hỏi thú vị. Thật không may tôi nghĩ rằng không có giải pháp - Tôi tò mò cho dù ai đó sẽ đưa ra một câu trả lời tốt. Nếu không, hãy xem http://stackoverflow.com/questions/3929087/dividing-a-project-into-multiple-xcode-project-files/3932613#3932613 :) –

Trả lời

7

1) phá vỡ dự án của bạn thành nhỏ hơn, thư viện logic hơn/gói. các dự án lớn thường xuyên là dấu hiệu của một thiết kế tồi, giống như đối tượng có quá nhiều hoặc là quá lớn.

2) thiết kế để dễ dàng xây dựng lại - điều này cũng giúp ích nếu bạn đang viết chương trình phải được xây dựng bởi nhiều công cụ hoặc IDE. nhiều 'dự án' của tôi có thể được xây dựng lại bằng cách thêm một thư mục.

3) loại bỏ các giai đoạn xây dựng không liên quan. ví dụ: tôi đã xóa giai đoạn xây dựng "Sao chép Tiêu đề" khỏi tất cả các dự án. bao gồm rõ ràng các tệp cụ thể thông qua chỉ thị bao gồm.

4) sử dụng tệp xcconfig bất cứ khi nào có thể. điều này cũng làm giảm số lượng thay đổi bạn phải thực hiện khi cập nhật bản dựng của mình. Tệp xcconfig xác định tập hợp các cài đặt xây dựng và hỗ trợ #include. tất nhiên, sau đó bạn xóa (phần lớn) người dùng xác định cài đặt từ mỗi dự án và mục tiêu khi bạn xác định xcconfig để sử dụng.

5) cho phụ thuộc mục tiêu: tạo mục tiêu thực hiện các phép toán logic, thay vì hoạt động thể chất. đây thường là mục tiêu tập lệnh shell hoặc mục tiêu tổng hợp. ví dụ: "xây dựng các phụ thuộc", "chạy tất cả các bài kiểm tra đơn vị", "xây dựng tất cả", "dọn sạch tất cả". thì bạn không phải duy trì mọi sự phụ thuộc thay đổi từng bước của một con đường - nó giống như sử dụng các tham chiếu.

6) xác định "Cây nguồn" chung cho mã của bạn và cột thứ hai cho nguồn của bên thứ ba.

7) có sẵn các công cụ xây dựng bên ngoài. điều này có thể là một lựa chọn cho bạn (ít nhất, đối với một số mục tiêu của bạn).

tại thời điểm này, một xcodeproj sẽ đơn giản hơn nhiều. nó sẽ yêu cầu ít thay đổi hơn và rất dễ xây dựng lại. bạn có thể đi xa hơn với các khái niệm này để giảm thêm sự phức tạp của các dự án và các bản dựng của bạn.

+0

Đề xuất tuyệt vời, mặc dù chúng vượt qua thay vì giải quyết vấn đề. 1 + 6 Tôi đã làm. 4 + 5 Tôi sẽ xem xét. 2 + 7 - bạn có thể cung cấp thêm thông tin? – Felixyz

+0

có, họ chỉ đơn giản là dự án tập tin/cấu trúc (và phá vỡ các vấn đề hơn giải quyết nó). 2) cấu trúc tệp nguồn, tài nguyên, trường hợp thử nghiệm, v.v. để bạn có thể dễ dàng tạo lại bất kỳ mục tiêu nào bằng cách thêm tất cả nội dung của thư mục vào dự án (cụ thể, trường hợp kiểm tra sẽ nằm trong dự án khác hoặc bạn có mục tiêu thứ hai dành riêng cho thử nghiệm mà bạn cũng sẽ xây dựng bằng cách thêm mọi thứ từ thư mục unit_test vào đích target_test). theo cách này, bạn sẽ viết và bố trí tệp nguồn (v.v.) để bạn có khả năng tạo lại bất kỳ mục tiêu nào dựa trên (phụ thuộc) – justin

+0

(tiếp theo) phụ thuộc của nó, toàn bộ nội dung của một thư mục và việc thêm một xcconfig. nếu một dự án bị hỏng hoặc phải được sử dụng trong một ide khác (hoặc phiên bản của xcode), quá trình nhập mất ít hơn 1 phút. điều này cũng có thể giúp giữ các bit chưa sử dụng trong cây dự án chính. nó cũng giúp dễ dàng tạo các bản dựng kết hợp. nếu bạn bị ám ảnh về việc khai báo đúng đắn những gì được xuất và khả năng hiển thị (chắc chắn sẽ là mối quan tâm nếu bạn đang làm việc trên các chương trình không tầm thường), thì bạn có thể tạo dựng kết hợp trong một thời gian rất ngắn. (cont) – justin

2

Cách tốt nhất mà tôi đã tìm thấy là hướng dẫn Git xử lý tệp .pbxproj dưới dạng nhị phân. Điều này ngăn cản sự kết hợp lộn xộn.

Thêm phần này vào tập tin .gitatributes của bạn:

*.pbxproj -crlf -diff -merge 
+1

Sự khác biệt này có ảnh hưởng gì đến sự kết hợp vật lý? – esbenr

+4

Nếu điều này làm cho tệp có hiệu quả nhị phân, làm cách nào để hợp nhất dễ dàng hơn? – damian

+1

hãy kiểm tra những điều sau: http://robots.thoughtbot.com/xcode-and-git-bridging-the-gap ---- Trích dẫn: Vì định dạng tùy chỉnh được sử dụng trong loại tệp này, đây là chính xác những gì chúng tôi muốn. Khi xung đột hợp nhất phát sinh đối với tệp này, git sẽ tự động kết hợp các thay đổi từ cả hai bên của xung đột, trước tiên áp dụng các thay đổi ngược dòng. – chakming

2

Để so sánh hai dự án Xcode mở mở FileMerge (mở xcode và chọn Xcode (từ khung manu) -> công cụ mở nhà phát triển -> FileMerge) . giờ hãy nhấp vào nút "trái" và mở thư mục chính của dự án xcode. nhấp vào nút "phải" và mở thư mục chính của dự án xcode để so sánh.

Bây giờ hãy nhấp vào nút "hợp nhất"!

Thats it!

+1

Dễ nhất, nếu bạn đang sử dụng git: 'git config --global merge.tool opendiff' (chỉ cần thực hiện một lần), sau đó' git mergetool' sẽ khởi chạy nó cho bạn. – damian

+1

Tôi không rõ ràng rằng FileMerge có hỗ trợ đặc biệt cho các tệp dự án Xcode nói riêng? – Benjohn

0

Một tùy chọn khác để xem xét có thể giúp giảm số lần bạn gặp sự cố. Để giải thích, tôi sẽ gọi chi nhánh mà các chi nhánh của các thành viên trong đội đến từ nhánh "phát triển". Có một quy ước trong nhóm của bạn rằng khi tệp dự án được sửa đổi, các thay đổi (cùng với bất kỳ thay đổi nào khác cần thiết để đảm bảo tính toàn vẹn xây dựng) được cam kết trong một cam kết riêng biệt. Đó là cam kết sau đó anh đào chọn vào chi nhánh phát triển. Các thành viên khác trong nhóm có kế hoạch sửa đổi tập tin dự án trong nhánh của họ sau đó có thể chọn cherry vào nhánh của họ hoặc rebase chi nhánh của họ về phát triển mới nhất. Cách tiếp cận này đòi hỏi thông tin liên lạc trên toàn đội và một số kỷ luật. Như tôi đã nói, nó sẽ không phải lúc nào cũng có thể; trên một số dự án nó có thể giúp ích rất nhiều và một số dự án có thể không.

3

Bạn có thể muốn thử https://github.com/simonwagner/mergepbx/

Đó là một kịch bản mà sẽ giúp bạn hợp nhất tập tin dự án XCode một cách chính xác. Lưu ý rằng nó vẫn là alpha.

Tuyên bố từ chối trách nhiệm: Tôi là tác giả của mergepbx.

+0

Simon, dự án này có trưởng thành vào lúc này không? –

+2

Vâng, nó hoạt động cho tôi - vậy có? Thật không may là không có khả năng để đảm bảo rằng nó thực sự có thể làm việc với tất cả mọi thứ trên mạng, vì không có tài liệu về định dạng tệp dự án. Vì vậy, nó sẽ không bao giờ tốt hơn "làm việc cho tôi và không ai phàn nàn cho đến nay." – Simon

+0

Simon - Sau nhiều năm phát triển và QA, nghe "tốt, nó làm việc cho tôi", điều đó làm tôi sợ. Có lẽ đó là tất cả những gì chúng tôi có, nhưng vẫn vậy. –

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