Bagaimana cara menggunakan Git dengan benar dengan Xcode?

94

Saya telah menjadi pengembang iphone untuk sementara waktu, dan saya baru-baru ini memasukkan git dalam alur kerja saya. Saya telah menggunakan pengaturan git yang ditemukan di http://shanesbrain.net/2008/7/9/using-xcode-with-git untuk alur kerja saya sejauh ini.

Pengaturan tersebut memberitahu git untuk mengecualikan * .pbxproj dari penggabungan? Apakah ada alasan nyata untuk melakukan ini? Misalnya, ketika saya menambahkan file ke proyek dan mendorong ke asal, rekan pengembang saya tidak akan menambahkan file itu ke proyek xcode mereka saat mereka menarik. Kemudian jika salah satu dari mereka membangun rilis, file ini mungkin tidak disertakan. Bukankah sebaiknya saya membiarkan git menangani penggabungan untuk file proyek? Mengapa atau mengapa file ini tidak harus digabungkan dan bagaimana menangani situasi dengan benar ketika file ditambahkan ke proyek?

rickharrison.dll
sumber
9
Saya tidak bekerja dengan XCode, tetapi jika file * .pbxproj adalah sesuatu seperti file * .csproj Visual Studio (agak dari daftar file) pengaturan ini tampaknya agak konyol bagi saya. Kedengarannya seperti seseorang bosan dengan konflik penggabungan ketika dua orang menambahkan file ke proyek dan berpikir solusi terbaik adalah mengacaukan semuanya ...
R. Martinho Fernandes
Masalah dengan XCode (tidak yakin tentang Visual Studio) adalah bahwa file .pbxproj hampir tidak dapat dibaca manusia, jadi tidak masuk akal untuk menyelesaikan konflik dengan tangan.
Tom
7
File * .pbxproj sebenarnya terstruktur dengan cukup baik, Anda hanya memiliki bentangan panjang antara akhir blok dan segmen awal. Anugrahnya adalah bahwa file tersebut memiliki jeda baris yang ditempatkan dengan sangat baik sehingga sulit untuk mengacaukannya hanya dengan memodifikasi baris dan automerge umumnya bekerja dengan sangat baik. Ini juga berarti blok gabungan umumnya mudah dipahami - Anda dapat melihat satu sisi dengan beberapa set file yang ditambahkan, sisi lainnya dengan set file yang berbeda ditambahkan.
Kendall Helmstetter Gelner

Jawaban:

136

Saya telah mengerjakan aplikasi iPhone secara penuh sejak peluncuran SDK, sebagian besar waktu itu dihabiskan untuk bekerja dalam tim dengan banyak pengembang.

Yang benar adalah bahwa jauh lebih berbahaya untuk melarang penggabungan file .pbxproj itu daripada membantu. Seperti yang Anda katakan, ketika Anda menambahkan file kecuali orang lain mendapatkan file itu, mereka juga harus menambahkannya ke proyek mereka - dalam aplikasi dengan ukuran berapa pun, itu menyebalkan dan itu juga menghilangkan manfaat besar dari kontrol kode sumber di dalam diri Anda. tidak dapat benar-benar kembali ke status proyek sebelumnya yang lengkap hanya melalui git.

File .pbxproj hanyalah daftar properti (mirip dengan XML). Dari pengalaman, HANYA konflik penggabungan yang pernah Anda dapatkan adalah jika dua orang menambahkan file pada saat yang bersamaan. Solusi dalam 99% kasus konflik penggabungan adalah mempertahankan kedua sisi penggabungan, yang untuk git setidaknya hanya melibatkan penghapusan baris >>>>, <<<<, dan ====. Sebenarnya ini sangat umum sehingga saya telah membuat skrip shell sederhana untuk memperbaiki file .pbxproj dalam status gabungan dari git, saya menjalankan ini dari dalam direktori proyek (di tingkat Kelas):

#!/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

Kasus terburuk jika gagal (Anda meminta XCode untuk memuat proyek dan gagal memuat), Anda cukup menghapus file .pbxproj, memeriksa master dari git, dan menambahkan kembali file Anda. Tapi saya tidak pernah mengalami hal itu selama berbulan-bulan menggunakan skrip ini, lagi-lagi bekerja penuh waktu pada aplikasi iPhone dengan beberapa pengembang lain.

Opsi lain (ditunjukkan dalam komentar di bawah) yang dapat Anda coba gunakan sebagai pengganti skrip, adalah menambahkan baris ini ke file .gitattributes:

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

Kemudian git akan selalu mengambil kedua sisi gabungan untuk file .pbxproject, memiliki efek yang sama seperti skrip yang saya sediakan hanya tanpa pekerjaan tambahan.

Terakhir, ini file .gitignore lengkap saya, menunjukkan apa yang saya lakukan untuk mengabaikannya karena ada beberapa hal yang tidak Anda inginkan - dalam kasus saya benar-benar hanya sisa-sisa emacs dan seluruh direktori build:

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

# old skool
.svn

# osx noise
.DS_Store
profile
Kendall Helmstetter Gelner
sumber
3
Apakah Anda menggunakan file .gitattributes sama sekali untuk proyek xcode Anda? Dan terima kasih atas wawasan Anda. Saya pikir akan lebih mudah untuk mencoba menggabungkan file pbxproj di masa mendatang.
rickharrison
1
Sampai saat ini kami belum pernah, meskipun beberapa aspek dari yang terlihat menarik - tetapi orang yang pernah bekerja dengan saya belum menjadi pengguna git tingkat lanjut, sehingga dukungan fitur-fitur canggih tidak kuat.
Kendall Helmstetter Gelner
1
“File .pbxproj hanyalah JSON (mirip dengan XML).” Sebenarnya, ini adalah daftar properti berformat OpenStep. Ide dasar yang sama dengan JSON, tetapi sintaksnya berbeda di beberapa tempat.
Peter Hosey
1
Hal lain untuk dicoba - set merge = union: stackoverflow.com/questions/2729109/…
Kendall Helmstetter Gelner
1
Saya setuju dengan @KendallHelmstetterGelner bukan menjalankan skrip, yang menghilangkan garis-garis khusus, Anda bisa memperbarui .gitattribute Anda dengan unionswitch: *.pbxproj text/plain -crlf -diff -merge union.
Besi
9

Ini berfungsi untuk saya di Xcode 4.6 dan Git 1.7.5.

Tambahkan dan komit file .gitattributes dengan ini:

*.pbxproj binary merge=union

Saya telah menguji ini dengan anggota tim lain dan bekerja dengan baik.

Diambil dari: http://robots.thoughtbot.com/post/33796217972/xcode-and-git-bridging-the-gap

oneyenjug
sumber
Merge = union bagus tetapi alat mergepbx harus menjadi jawaban yang diterima.
Alper
8

Terus terang, jawaban yang ada saat ini menyesatkan.

Jika Anda tidak pernah menghapus atau mengganti nama file, maka menggunakan merge=unionstrategi, yang hanya menggabungkan perbedaan dalam komitmen yang berbeda secara langsung, adalah ide yang bagus.

Namun, di dunia nyata, kami terkadang perlu menghapus atau mengganti nama file. Menggabungkan perbedaan tanpa modifikasi akan membuat banyak masalah dalam situasi ini, dan masalah ini biasanya mengarah ke masalah "Integritas Ruang Kerja - Tidak dapat memuat proyek", yang membuat Anda bahkan tidak dapat menjalankan proyek.

Solusi terbaik yang saya dapatkan sejauh ini:

1) Rancang proyek dengan baik dan tambahkan semua file yang diperlukan di awal, jadi Anda jarang perlu mengubah file project.pbxproj.

2) Buat fitur Anda kecil. Jangan melakukan terlalu banyak hal di cabang.

3) Untuk alasan apa pun, jika Anda perlu mengubah struktur file dan mengalami konflik project.pbxproj, gunakan editor teks favorit Anda untuk menyelesaikannya secara manual. Saat Anda membuat tugas Anda kecil, konflik mungkin mudah diselesaikan.

Brian
sumber
3

Jawaban singkatnya adalah meskipun Anda tidak menyertakan baris tersebut .gitattributes, Anda mungkin tidak dapat dengan mudah menggabungkan dua versi .pbxproj yang dimodifikasi. Lebih baik git memperlakukannya sebagai biner.

Lihat di sini untuk detailnya: Git dan pbxproj

Pembaruan: Meskipun buku git masih setuju dengan jawaban ini, saya tidak lagi melakukannya. Saya mengontrol versi saya .pbxprojsama seperti file sumber non-biner lainnya.

Tom
sumber
kedengarannya seperti Anda dapat mengatur filter komit untuk mengirim file melalui simplejsonatau lebih rapi dalam perjalanan ke indeks. Itu masih belum dijamin berhasil.
Intuisi
1
Ini bukan file berformat JSON. Terlihat mirip tetapi memiliki banyak perbedaan secara detail.
eonil
Ia mengatakan JSON-nya di buku git, tetapi sepertinya itu salah. git-scm.com/book/ch7-2.html
huggie
1
BAIK. .pbxprojFile sebenarnya adalah file NeXT / Cocoa PList gaya lama, yang lebih lama, dan didefinisikan jauh lebih awal dari JSON, dan sekarang tidak digunakan lagi oleh Apple. (tetapi mereka masih menggunakannya di beberapa tempat) Penyebutan file di dalam buku salah sama sekali. Saya menghapus suara karena Anda menyebutkannya secara eksplisit.
eonil
2

Saya memang membuat skrip Python yang dapat menangani konflik penggabungan dalam file Proyek XCode.

Jika Anda ingin mencobanya, Anda dapat memeriksanya di sini: https://github.com/simonwagner/mergepbx

Anda harus menginstalnya sebagai driver gabungan, sehingga akan dipanggil secara otomatis ketika Anda memiliki konflik penggabungan dalam file proyek Anda (README.md akan memberitahu Anda bagaimana melakukannya).

Ini harus bekerja jauh lebih baik daripada menggunakan merge=unionsebagai mergepbxmemahami semantik file proyek Anda dan karena itu akan menyelesaikan konflik dengan benar.

Namun proyek ini masih dalam tahap alfa, jangan berharap untuk memahami setiap file proyek yang ada.

Simon
sumber