Browsed by
Month: November 2014

[Xcode] Git và xử lý xung đột với file .pbxproj

[Xcode] Git và xử lý xung đột với file .pbxproj

Vướng

Mình chuyển qua dùng Git cũng được một thời gian, nhưng cũng chỉ dùng như một trình sao lưu code, gần đây thì bắt đầu tập thói quen branch theo các flow phổ biến. Về phía Xcode, Xcode đã tích hợp luôn Git vào từ phiên bản 4, rất tiện để dev (mặc dù mình thấy xài Terminal thì tiện hơn).

Nhưng tách branch lại sinh ra vấn đề khác.

Trong một project gần đây, mình tách một branch usermodel để build user model, mình tách một branch facebooklogin để nhét cái tính năng đăng nhập bằng Facebook. Sau khi dev xong cả 2, mình tiến hành merge usermodel vào facebooklogin (đăng nhập xong thì phải có cái gì đó để lưu thông tin user chứ).

Conflict!

Và cụ thể là ở file project.pbxproj.

Tìm

Đào Google một hồi thì biết project.pbxproj là một file có thể đọc dưới dạng text, nội dung của nó được cấu trúc dưới dạng namevalue, thằng Apple gọi nó là Property Lists, không hẳn giống nhưng mà có chung tư tưởng với JSON. Nhiệm vụ của con khủng long này lưu lại tất cả cấu trúc project hiện tại của bạn: gồm có những file nào, group nào, cái nào nằm trong cái nào, cái nào link cái nào, blah blah blah. Vậy nên việc merge 2 branch này và gặp conflict cũng là điều dễ hiểu, nhất là khi một branch add một đống các file này còn branch kia lại add một đống các file khác. Về mặt lý thuyết thì chúng ta vẫn có thể xử lý conflict bằng tay (đằng nào thì nó cũng có cấu trúc mà :3), nhưng mà thử mở con khủng long này lên thì choáng cmnl :v Bạn nào bảo merge tay không sao thì còn khủng long hơn cả nó :v

Gỡ

Google thêm tí thì đào được giải pháp từ chỗ này, cách làm là tạo một file .gitattributes, nhét vào trong thư mục gốc của project (là cái thư mục có chưa file .xcodeproj ấy :3), file đó sẽ có nội dung như sau:

*.pbxproj binary merge=union

Save lại là xong, giờ merge ngon lành.

Hiểu

Lệnh trên có 2 phần:

  • Phần đầu là tên các file sẽ được áp dụng, cụ thể ở đây là tất cả những file có ext là pbxproj.
  • Phần sau sẽ là các flag:
    • Flag binary : xem file này như là một file binary. Về bản chất, flag binary  tương đương với việc xài kết hợp cùng lúc flag -crlf  (không động đến CRLF) và flag -diff  (không đụng đến khi so sánh).
    • Flag merge=union : lúc merge thì nhét cả 2 cái vào 1 hộ tao.

Túm lại là câu lệnh có nghĩa là: với những file có đuôi pbxproj thì bỏ qua mấy cái vấn đề với CRLF, lúc diff thì đừng có lên nó ra, còn lúc merge thì cứ nhét chung cả 2 cái vô một.

Thế là xong :v chúc các bạn thành công :3

YOLO \m/