Làm thế nào để sử dụng Git đúng cách với Xcode?


94

Tôi đã là nhà phát triển iPhone được một thời gian và gần đây tôi đã đưa git vào quy trình làm việc của mình. Cho đến nay, tôi đã sử dụng cài đặt git trên http://shanesbrain.net/2008/7/9/using-xcode-with-git cho quy trình làm việc của mình.

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


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

Vấn đề với XCode (không chắc chắn về Visual Studio) là tệp .pbxproj hầu như không thể đọc được bởi con người, vì vậy không có ý nghĩa gì khi 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ó khoảng thời gian dài giữa các phân đoạn kết thúc khối và bắt đầu. Ưu điểm của việc tiết kiệm là tệp có các dấu ngắt dòng được đặt rất tốt nên thật khó để làm rối nó chỉ cần sửa đổi các dòng và tự động hóa thường hoạt động rất tốt. Điều đó cũng có nghĩa là các khối hợp nhất nói chung rất dễ hiểu - bạn có thể thấy một bên có một vài tập hợp tệp được thêm vào, bên kia có thêm các bộ tệp khác nhau.
Kendall Helmstetter Gelner

Câu trả lời:


136

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

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

Tệp .pbxproj chỉ đơn giản là một danh sách thuộc tính (tương tự như XML). Theo kinh nghiệm, chỉ về xung đột hợp nhất DUY NHẤT mà bạn từng gặp phải 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 hợp nhất, điều này đối với git ít nhất chỉ đơn giản là xóa bất kỳ dòng >>>>, <<<< và ==== nào. Trên thực tế, điều này rất phổ biến nên tôi đã tạo một tập lệnh shell đơn giản để sửa tệp .pbxproj ở trạng thái hợp nhất từ ​​git, tôi chạy điều này từ 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

Trường hợp xấu nhất 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 tổng thể từ git và thêm lại các tệp của bạn. Nhưng tôi chưa bao giờ có điều đó xảy ra trong nhiều tháng sử dụng với tập lệnh 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 (được chỉ ra trong nhận xét bên dưới) mà bạn có thể thử sử dụng thay cho tập lệnh, là thêm dòng này vào tệp .gitattributes:

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

Sau đó, git sẽ luôn lấy cả hai mặt của một hợp nhất cho các tệp .pbxproject, có tác dụng giống như tập lệnh mà tôi đã cung cấp chỉ mà không cần thực hiện thêm bất kỳ thao tác nào.

Cuối cùng, đây là tệp .gitignore hoàn chỉnh của tôi, hiển thị những gì tôi đã đặt nó để bỏ qua vì có một số thứ bạn không muốn - trong trường hợp của tôi thực sự chỉ là tàn dư của emacs và toàn bộ thư mục xây dựng:

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

# old skool
.svn

# osx noise
.DS_Store
profile

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

1
Cho đến nay, chúng tôi vẫn chưa làm như vậy, mặc dù một số khía cạnh của điều đó trông thú vị - nhưng những người tôi đã làm việc cùng không phải là người dùng git nâng cao, và vì vậy việc ủng hộ các tính năng nâng cao là không mạnh.
Kendall Helmstetter Gelner

1
“Tệp .pbxproj chỉ đơn giản là JSON (tương tự như XML).” Trên thực tế, đó là một 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 nhau ở một vài chỗ.
Peter Hosey

1
Một điều khác để thử - đặt merge = union: stackoverflow.com/questions/2729109/…
Kendall Helmstetter Gelner,

1
Tôi đồng ý với @KendallHelmstetterGelner thay vì chạy kịch bản của bạn, mà loại bỏ những dòng đặc biệt, bạn có thể cập nhật .gitattribute của bạn với các unioncông tắc: *.pbxproj text/plain -crlf -diff -merge union.
Besi,

9

Điều này hoạt động đối với tôi trong Xcode 4.6 và Git 1.7.5.

Thêm và xác nhận tệp .gitattributes với tệp này:

*.pbxproj binary merge=union

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

Lấy từ: http://robots.thoughtbot.com/post/33796217972/xcode-and-git-bridging-the-gap


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

8

Thành thật mà nói, các câu trả lời hiện có là sai lệch.

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

Tuy nhiên, trong thế giới thực, đôi khi chúng ta cần xóa hoặc đổi tên tệp. Hợp nhất các điểm khác biệt mà không có bất kỳ sửa đổi nào sẽ tạo ra rất nhiều vấn đề trong những tình huống này và những vấn đề này thường dẫn đến vấn đề "Tính toàn vẹn của 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 nhận được cho đến nay:

1) Thiết kế dự án tốt và thêm tất cả các tệp cần thiết vào đầu, vì vậy bạn sẽ hiếm khi cần 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ì bất kỳ lý do gì, nếu bạn cần sửa đổi cấu trúc tệp và nhận được xung đột 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.


3

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

Xem chi tiết tại đây: Git và pbxproj

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


có vẻ như bạn có thể thiết lập một bộ lọc cam kết để gửi tệp qua simplejsonhoặc một số ngăn nắp như vậy trên đường đến chỉ mục. Mặc dù vậy, nó vẫn sẽ không được đảm bảo hoạt động.
trực giác

1
Nó không phải là một tệp có định dạng JSON. Trông giống nhau nhưng có nhiều điểm khác biệt về chi tiết.
eonil,

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

1
ĐỒNG Ý. .pbxprojtệp thực sự là tệp NeXT / Cocoa PList kiểu cũ, cũ hơn và được định nghĩa sớm hơn rất nhiều so với JSON và hiện không được Apple chấp nhận. (nhưng họ vẫn đang sử dụng nó ở một số nơi) Việc đề cập đến tập tin trong cuốn sách là hoàn toàn sai. Tôi đã loại bỏ phiếu bầu vì bạn đã đề cập đến nó một cách rõ ràng.
eonil,

2

Tôi đã tạo một tập lệnh Python có thể xử lý xung đột hợp nhất trong các tệp Dự án XCode.

Nếu muốn dùng thử, bạn có thể xem qua tại đây: https://github.com/simonwagner/mergepbx

Bạn sẽ phải cài đặt nó làm trình điều khiển hợp nhất, vì vậy nó sẽ tự động được gọi khi bạn có xung đột hợp nhất trong tệp dự án của mình (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=unionnhư mergepbxhiể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 còn ở dạng alpha, đừng mong đợi nó hiểu mọi tệp dự án có sẵn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.