Git Xcode ile nasıl doğru kullanılır?


94

Bir süredir iphone geliştiricisiyim ve son zamanlarda iş akışıma git'i dahil ediyorum. Şimdiye kadar iş akışım için http://shanesbrain.net/2008/7/9/using-xcode-with-git adresinde bulunan git ayarlarını kullandım .

Bu ayarlar git'e * .pbxproj'yi birleştirmelerin dışında tutmasını söyler mi? Bunu yapmanın gerçek bir nedeni var mı? Örneğin, projeye bir dosya ekleyip orijinale ittiğimde, geliştiricilerim bu dosyayı çektiklerinde xcode projelerine eklemeyecekler. Daha sonra bunlardan biri bir sürüm oluşturursa, bu dosya dahil edilmeyebilir. Git'in proje dosyası için birleştirmeleri yönetmesine izin vermem gerekmez mi? Bu dosya neden veya neden birleştirilmemeli ve dosyalar projeye eklendiğinde durum nasıl düzgün bir şekilde ele alınmalı?


9
XCode ile çalışmıyorum, ancak * .pbxproj dosyaları Visual Studio'nun * .csproj dosyalarına benziyorsa (bir şekilde bir dosya listesi) bu ayar bana oldukça aptalca geliyor. İki kişi projeye dosya ekleyip en iyi çözümün her şeyi mahvetmek olduğunu düşündüğünde birisi birleştirme çatışmalarından bıkmış gibi görünüyor ...
R. Martinho Fernandes

XCode ile ilgili sorun (Visual Studio hakkında emin değiliz) .pbxproj dosyalarının neredeyse hiç okunamaz olmasıdır, bu nedenle çakışmaları elle çözmek mantıklı değildir.
Tom

7
* .pbxproj dosyaları aslında oldukça iyi yapılandırılmıştır, sadece blok sonu ve başlangıç ​​segmentleri arasında uzun süreler vardır. Tasarruf zarafeti, dosyanın çok iyi yerleştirilmiş satır sonlarına sahip olmasıdır, bu nedenle sadece satırları değiştirmekle uğraşmak zor ve otomatikleştirme genellikle çok iyi çalışıyor. Bu aynı zamanda, birleştirme bloklarının genellikle anlaşılması kolay olduğu anlamına gelir - bir tarafı birkaç dosya grubu eklenmiş, diğer tarafı farklı dosya grupları eklenmiş olarak görebilirsiniz.
Kendall Helmstetter Gelner

Yanıtlar:


136

SDK lansmanından bu yana iPhone uygulamaları üzerinde tam zamanlı çalıştım, çoğu zaman birden fazla geliştiriciyle ekipler üzerinde çalışarak geçirdim.

Gerçek şu ki, bu .pbxproj dosyasının birleştirilmesine izin vermemek yararlı olduğundan çok daha zararlıdır. Dediğiniz gibi, başkaları o dosyayı almadıkça bir dosya eklediğinizde, onu projelerine de eklemeleri gerekir - her boyutta, berbat bir uygulamada ve aynı zamanda kaynak kod kontrolünün büyük bir faydasını ortadan kaldırır. git aracılığıyla tam bir önceki proje durumuna gerçekten geri dönemez.

.Pbxproj dosyası basitçe bir özellik listesidir (XML'e benzer). Deneyimlere göre, yaşadığınız YALNIZCA birleştirme çatışması, iki kişinin aynı anda dosya eklemiş olmasıydı. Birleştirme çakışması durumlarının% 99'undaki çözüm, birleştirmenin her iki tarafını da tutmaktır; bu, git için en azından herhangi bir >>>>, <<<< ve ==== satırının kaldırılmasını içerir. Aslında bu o kadar yaygın ki git'ten bir birleştirme durumunda bir .pbxproj dosyasını düzeltmek için basit bir kabuk komut dosyası oluşturdum, bunu proje dizininden çalıştırıyorum (Sınıflar düzeyinde):

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

En kötü durum, başarısız olursa (XCode'dan projeyi yüklemesini istersiniz ve yüklenemezse), .pbxproj dosyasını silmeniz, git'ten ana kopyaya göz atmanız ve dosyalarınızı yeniden eklemeniz yeterlidir. Ancak bu komut dosyasını aylarca kullandığımda, yine iPhone uygulamalarında diğer birkaç geliştiriciyle tam zamanlı çalışarak bunu hiç yaşamadım.

Komut dosyası yerine kullanmayı deneyebileceğiniz başka bir seçenek (aşağıdaki yorumlarda belirtilmiştir), bu satırı bir .gitattributes dosyasına eklemektir:

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

Sonra git her zaman .pbxproject dosyaları için bir birleştirmenin her iki tarafını da alır, bu da benim sağladığım komut dosyasıyla aynı etkiye sahiptir ve fazladan çalışma gerektirmez.

Son olarak, işte tam .gitignore dosyam, istemediğiniz birkaç şey olduğu için görmezden gelmek için ayarladığım şeyi gösteriyor - benim durumumda gerçekten sadece kalıntıları ve tüm yapı dizini emacs:

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

# old skool
.svn

# osx noise
.DS_Store
profile

3
Xcode projeniz için bir .gitattributes dosyası kullanıyor musunuz? Ve anlayışınız için teşekkür ederim. Gelecekte pbxproj dosyalarını birleştirmeyi denemenin çok daha kolay olacağını düşünüyorum.
rickharrison

1
Bugüne kadar, bazı yönleri ilginç görünse de, olmamıştık - ancak birlikte çalıştığım kişiler ileri düzey git kullanıcıları değildi ve bu nedenle gelişmiş özelliklerin savunulması güçlü değil.
Kendall Helmstetter Gelner

1
".Pbxproj dosyası kısaca JSON'dur (XML'e benzer)." Aslında, OpenStep biçimli bir özellik listesidir. JSON ile aynı temel fikirler, ancak sözdizimi birkaç yerde farklılık gösteriyor.
Peter Hosey


1
Ben @KendallHelmstetterGelner yerine bu özel çizgilerini kaldırır Senaryonu, çalışan, sen ile .gitattribute güncelleme olabilir katılıyorum unionanahtarı: *.pbxproj text/plain -crlf -diff -merge union.
Besi


8

Açıkçası, mevcut cevaplar yanıltıcıdır.

Eğer varsa asla silmek veya sonra kullanarak, dosyaları yeniden adlandırmakmerge=union sadece doğrudan farklı kaydedilmesini farklılıkları birleştiren bir strateji, iyi bir fikirdir.

Bununla birlikte, gerçek dünyada bazen dosyaları silmemiz veya yeniden adlandırmamız gerekir. Farklılıkları herhangi bir değişiklik yapmadan birleştirmek çok fazla sorun yaratır bu durumlarda çıkarır ve bu sorunlar genellikle "Çalışma Alanı Bütünlüğü - Proje yüklenemedi" sorununa yol açar ve bu da sizi projeyi yürütemez hale getirir.

Şimdiye kadar aldığım en iyi çözüm:

1) Projeyi iyi tasarlayın ve gerekli tüm dosyaları başlangıçta ekleyin, böylece nadiren project.pbxproj.

2) Özelliklerinizi küçültün. Bir dalda çok fazla şey yapmayın.

3) Herhangi bir nedenle, dosya yapısını değiştirmeniz ve çakışmalara girmeniz gerekirse project.pbxproj, bunları manuel olarak çözmek için favori metin düzenleyicinizi kullanın. Görevlerinizi küçültürken, çatışmaları çözmek kolay olabilir.


3

Kısa cevap, bu satırı dahil .gitattributesetmeseniz bile, bir .pbxproj dosyasının iki değiştirilmiş sürümünü kolayca birleştiremeyebileceğinizdir. Git'in onu ikili olarak ele alması daha iyi.

Ayrıntılar için buraya bakın: Git ve pbxproj

Güncelleme: Git kitabı hala bu cevabı kabul etse de , artık kabul etmiyorum. .pbxprojDiğer ikili olmayan kaynak dosyalar gibi sürümümü kontrol ediyorum .


dosyayı göndermek için bir kesinleştirme filtresi simplejsonveya dizine giden yol üzerinde daha düzenli bir şekilde ayarlayabileceğiniz gibi görünüyor . Yine de çalışması garanti edilmez.
intuited

1
JSON biçimli bir dosya değil. Benzer görünüyor ama ayrıntıda birçok fark var.
eonil

Git kitabında JSON'u yazıyor, ama yanlış gibi görünüyor. git-scm.com/book/ch7-2.html
huggie

1
TAMAM. .pbxprojdosyası aslında eski tarz bir NeXT / Cocoa PList dosyasıdır, daha eski ve JSON'dan çok daha önce tanımlanmış ve şimdi Apple tarafından kullanımdan kaldırılmıştır. (ama hala bazı yerlerde kullanıyorlar) Kitapta dosyadan bahsetmek tamamen yanlış. Açıkça bahsettiğiniz için olumsuz oyu kaldırdım.
eonil

2

XCode Proje dosyalarındaki birleştirme çakışmalarını idare edebilen bir Python betiği oluşturdum.

Denemek isterseniz, buradan kontrol edebilirsiniz: https://github.com/simonwagner/mergepbx

Bunu bir birleştirme sürücüsü olarak yüklemeniz gerekecek, böylece proje dosyanızda bir birleştirme çakışması olduğunda otomatik olarak çağrılır (README.md size bunu nasıl yapacağınızı söyleyecektir).

merge=unionOlarak kullanmaktan çok daha iyi çalışmalımergepbx doğru çatışmayı çözecek nedenle proje dosyasının semantiğini anlayan ve.

Ancak proje hala alfa, orada bulunan her proje dosyasını anlamasını beklemeyin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.