2010-04-10 37 views
84

Tôi đã là một nhà phát triển iphone trong một thời gian và gần đây tôi đã bao gồm git trong luồng công việc của mình. Tôi đã sử dụng cài đặt git được tìm thấy trên http://shanesbrain.net/2008/7/9/using-xcode-with-git cho luồng công việc của mình cho đến thời điểm này.Làm thế nào để sử dụng Git đúng cách với XCode?

Các cài đặt đó yêu cầu git loại trừ * .pbxproj khỏi các lần hợp nhất? Có lý do thực sự nào để làm điều này không? Ví dụ: khi tôi thêm tệp vào dự án và đẩy tới nguồn gốc, các nhà phát triển đồng nghiệp của tôi sẽ không có tệp đó được thêm vào dự án xcode của họ khi họ kéo. Sau đó, nếu một trong số họ xây dựng một bản phát hành tập tin này có thể không được bao gồm. Không nên tôi chỉ để cho git xử lý các hợp nhất cho các tập tin dự án? Ai đó có thể vui lòng giải thích lý do tại sao hoặc tại sao tệp này không được hợp nhất và cách xử lý đúng tình huống khi tệp được thêm vào dự án. Cảm ơn.

+7

Tôi không làm việc với XCode, nhưng nếu các tệp * .pbxproj là bất kỳ thứ gì như tệp * .csproj của Visual Studio (phần nào của danh sách tệp), cài đặt này có vẻ hơi ngu ngốc đối với tôi. Có vẻ như ai đó đã mệt mỏi vì xung đột hợp nhất khi hai người thêm tệp vào dự án và nghĩ giải pháp tốt nhất là vặn mọi thứ lên ... –

+0

Vấn đề với XCode (không chắc chắn về Visual Studio) là tệp .pbxproj chỉ là con người có thể đọc được, do đó không có ý nghĩa để giải quyết xung đột bằng tay. – Tom

+7

*.Các tệp pbxproj thực sự được cấu trúc khá tốt, bạn chỉ cần trải dài giữa phần cuối khối và phân đoạn bắt đầu. Niềm hạnh phúc tiết kiệm là tập tin có các ngắt dòng rất tốt nên rất khó để làm hỏng nó chỉ cần sửa đổi dòng và automerge thường hoạt động rất tốt. Nó cũng có nghĩa là các khối hợp nhất thường dễ hiểu - bạn có thể thấy một bên với một vài tập hợp các tệp được thêm vào, phần còn lại có các bộ tệp khác nhau được thêm vào. –

Trả lời

124

Tôi đã làm việc trên các ứng dụng iPhone toàn thời gian kể từ khi khởi chạy SDK, phần lớn thời gian đó dành cho các nhóm có nhiều nhà phát triển.

Sự thật là có nhiều cách gây hại hơn để không cho phép hợp nhất tệp .pbxproj đó so với tệp hữu ích. Như bạn nói, khi bạn thêm tệp trừ khi người khác nhận được tệp đó, họ cũng phải thêm tệp đó vào dự án của họ - trong một ứng dụng có kích thước bất kỳ và điều đó cũng mang lại lợi ích to lớn cho việc kiểm soát mã nguồn không thể quay trở lại trạng thái dự án hoàn chỉnh trước đó chỉ qua git.

Tệp .pbxproj chỉ đơn giản là danh sách thuộc tính (tương tự như XML). Từ kinh nghiệm, chỉ về cuộc xung đột hợp nhất CHỈ mà bạn từng nhận được là nếu hai người đã thêm tệp cùng một lúc. Giải pháp trong 99% các trường hợp xung đột hợp nhất là giữ cả hai mặt của quá trình hợp nhất, cho git ít nhất đơn giản là xóa mọi >>>>, < < < < và ==== dòng. Trong thực tế này là rất phổ biến mà tôi đã tạo ra một kịch bản shell đơn giản để sửa chữa một tập tin .pbxproj trong trạng thái hợp nhất từ ​​git, tôi chạy này từ bên trong thư mục dự án (ở cấp lớp):

#!/bin/sh 

    projectfile=`find -d . -name 'project.pbxproj'` 
    projectdir=`echo *.xcodeproj` 
    projectfile="${projectdir}/project.pbxproj" 
    tempfile="${projectdir}/project.pbxproj.out" 
    savefile="${projectdir}/project.pbxproj.mergesave" 

    cat $projectfile | grep -v "<<<<<<< HEAD" | grep -v "=======" | grep -v "^>>>>>>> " > $tempfile 
    cp $projectfile $savefile 
    mv $tempfile $projectfile 

xấu nhất trường hợp nếu nó không thành công (bạn yêu cầu XCode tải dự án và nó không tải được), bạn chỉ cần xóa tệp .pbxproj, kiểm tra chủ từ git và thêm lại tệp của bạn. Nhưng tôi đã không bao giờ có điều đó xảy ra trong nhiều tháng sử dụng với kịch bản này, một lần nữa làm việc toàn thời gian trên các ứng dụng iPhone với một số nhà phát triển khác.

Một tùy chọn khác (chỉ ra trong ý kiến ​​dưới đây) mà bạn có thể thử sử dụng ở vị trí của kịch bản, là thêm dòng này vào một tập tin .gitattributes:

*.pbxproj text -crlf -diff -merge=union 

Sau đó git sẽ luôn lấy hai bên hợp nhất cho các tệp .pbxproject, có tác dụng tương tự như tập lệnh tôi chỉ cung cấp mà không cần thêm bất kỳ công việc nào.

Cuối cùng, đây là nội dung hoàn chỉnh của tôi.tập gitignore, cho thấy những gì tôi có nó thiết lập để bỏ qua vì có một vài điều bạn không muốn - trong trường hợp của tôi thực sự chỉ Emacs tàn dư và cả xây dựng thư mục:

# xcode noise 
build/* 
*.pbxuser 
*.mode1v3 
*~ 

# old skool 
.svn 

# osx noise 
.DS_Store 
profile 
+2

Bạn có sử dụng tệp .gitattributes cho dự án xcode của mình không? Và cảm ơn vì sự thấu hiểu của bạn. Tôi nghĩ sẽ dễ dàng hơn khi thử hợp nhất các tệp pbxproj trong tương lai. – rickharrison

+1

Cho đến nay chúng ta chưa từng có, mặc dù một số khía cạnh của cái nhìn thú vị đó - nhưng những người tôi đã làm việc không phải là người dùng git tiên tiến, và do đó việc thúc đẩy các tính năng nâng cao không mạnh. –

+1

“Tệp .pbxproj chỉ đơn giản là JSON (tương tự như XML).” Trên thực tế, đây là danh sách thuộc tính được định dạng OpenStep. Các ý tưởng cơ bản giống như JSON, nhưng cú pháp khác ở một vài nơi. –

2

Câu trả lời ngắn gọn là ngay cả khi bạn không bao gồm dòng đó trong .gitattributes, bạn có thể không dễ dàng hợp nhất hai phiên bản đã sửa đổi của tệp .pbxproj. Nó tốt hơn cho git để coi nó như là một nhị phân.

Xem ở đây để biết chi tiết: Git and pbxproj

Cập nhật: Mặc dù cuốn sách git still agrees với câu trả lời này, tôi không còn làm. Phiên bản của tôi kiểm soát .pbxproj của tôi giống như bất kỳ tệp nguồn nhị phân nào khác.

+0

có vẻ như bạn có thể thiết lập bộ lọc cam kết để gửi tệp thông qua 'simplejson' hoặc một số bộ lọc như vậy trên đường đến chỉ mục. Nó vẫn sẽ không được đảm bảo để làm việc mặc dù. – intuited

+1

Đây không phải là tệp có định dạng JSON. Có vẻ tương tự nhưng có nhiều khác biệt chi tiết. – Eonil

+0

Nó nói JSON của nó trong sách git, nhưng có vẻ như nó sai. http://git-scm.com/book/ch7-2.html – huggie

5

này làm việc cho tôi trong Xcode 4.6 và Git 1.7.5.

Add và cam kết .gitattributes nộp với điều này:

*.pbxproj binary merge=union 

Tôi đã thử nghiệm điều này với một thành viên trong nhóm và hoạt động tuyệt vời.

Trích từ: http://robots.thoughtbot.com/post/33796217972/xcode-and-git-bridging-the-gap

+0

Hợp nhất = công đoàn là tốt nhưng công cụ mergepbx phải là câu trả lời được chấp nhận. – Alper

2

tôi đã tạo ra một kịch bản Python có thể xử lý xung đột nhập trong các tập tin dự án XCode.

Nếu bạn muốn thử nó, bạn có thể kiểm tra xem nó ra ở đây: https://github.com/simonwagner/mergepbx

Bạn sẽ phải cài đặt nó như là một trình điều khiển hợp nhất, vì vậy nó được gọi tự động khi bạn có một cuộc xung đột nhập trong tập tin dự án của bạn (README.md sẽ cho bạn biết cách thực hiện điều đó).

Nó sẽ hoạt động tốt hơn nhiều so với việc sử dụng merge=union làm mergepbx hiểu ngữ nghĩa của tệp dự án của bạn và do đó sẽ giải quyết xung đột một cách chính xác.

Tuy nhiên dự án vẫn là alpha, đừng mong đợi nó hiểu mọi tệp dự án ở ngoài đó.

5

Thành thật mà nói, câu trả lời hiện có là gây hiểu lầm.

Nếu bạn không bao giờ xóa hoặc đổi tên tệp, sau đó sử dụng chiến lược merge=union, kết hợp sự khác biệt trong các cam kết khác nhau trực tiếp, là một ý tưởng hay.

Tuy nhiên, trong thế giới thực, đôi khi chúng tôi cần xóa hoặc đổi tên tệp. Việc hợp nhất các khác biệt mà không có bất kỳ sửa đổi nào sẽ làm cho nhiều sự cố trong các trường hợp này và các sự cố này thường dẫn đến vấn đề "Tính toàn vẹn không gian làm việc - Không thể tải dự án", khiến bạn thậm chí không thể chạy dự án.

Giải pháp tốt nhất mà tôi có cho đến nay:

1) Thiết kế dự án tốt và thêm tất cả các file cần thiết ngay từ đầu, vì vậy bạn sẽ hiếm khi cần phải thay đổi project.pbxproj.

2) Làm cho các tính năng của bạn trở nên nhỏ bé. Đừng làm quá nhiều thứ trong một chi nhánh.

3) Vì lý do nào đó, nếu bạn cần sửa đổi cấu trúc tệp và nhận xung đột trong project.pbxproj, hãy sử dụng trình soạn thảo văn bản yêu thích của bạn để giải quyết chúng theo cách thủ công. Khi bạn thực hiện các nhiệm vụ của mình rất nhỏ, các xung đột có thể dễ dàng giải quyết.

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