Wie verwende ich Git richtig mit Xcode?

94

Ich bin seit einiger Zeit ein iPhone-Entwickler und habe kürzlich Git in meinen Workflow aufgenommen. Ich habe bisher Git-Einstellungen unter http://shanesbrain.net/2008/7/9/using-xcode-with-git für meinen Workflow verwendet.

Diese Einstellungen weisen git an, * .pbxproj von Zusammenführungen auszuschließen. Gibt es einen wirklichen Grund dafür? Wenn ich beispielsweise dem Projekt eine Datei hinzufüge und zum Ursprung pushe, wird diese Datei meinen Entwicklern beim Ziehen nicht zu ihrem xcode-Projekt hinzugefügt. Wenn einer von ihnen eine Version erstellt, ist diese Datei möglicherweise nicht enthalten. Sollte ich nicht einfach Git die Zusammenführungen für die Projektdatei überlassen? Warum oder warum sollte diese Datei nicht zusammengeführt werden und wie kann mit der Situation umgegangen werden, wenn Dateien zum Projekt hinzugefügt werden?

Rickharrison
quelle
9
Ich arbeite nicht mit XCode, aber wenn * .pbxproj-Dateien etwas mit den * .csproj-Dateien von Visual Studio zu tun haben (eine Art Liste von Dateien), erscheint mir diese Einstellung eher idiotisch. Es hört sich so an, als hätte jemand die Zusammenführungskonflikte satt, als zwei Leute Dateien zum Projekt hinzufügten und dachten, die beste Lösung wäre, alles zu vermasseln ...
R. Martinho Fernandes
Das Problem mit XCode (bei Visual Studio nicht sicher) ist, dass .pbxproj-Dateien kaum lesbar sind. Daher ist es nicht sinnvoll, Konflikte manuell zu lösen.
Tom
7
* .pbxproj-Dateien sind eigentlich ziemlich gut strukturiert, Sie haben nur lange Strecken zwischen dem Blockende- und dem Startsegment. Die Rettung besteht darin, dass die Datei sehr gut platzierte Zeilenumbrüche enthält, so dass es schwierig ist, sie durcheinander zu bringen, wenn nur Zeilen geändert werden und Automerge im Allgemeinen sehr gut funktioniert. Dies bedeutet auch, dass die Zusammenführungsblöcke im Allgemeinen leicht zu verstehen sind. Auf der einen Seite werden einige Dateisätze hinzugefügt, auf der anderen Seite werden verschiedene Dateisätze hinzugefügt.
Kendall Helmstetter Gelner

Antworten:

136

Ich habe seit dem Start des SDK Vollzeit an iPhone-Anwendungen gearbeitet. Die meiste Zeit habe ich in Teams mit mehreren Entwicklern gearbeitet.

Die Wahrheit ist, dass es weitaus schädlicher ist, das Zusammenführen dieser .pbxproj-Datei zu verbieten, als es hilfreich ist. Wie Sie sagen, wenn Sie eine Datei hinzufügen, es sei denn, andere Personen erhalten diese Datei, müssen sie sie auch zu ihrem Projekt hinzufügen - in einer Anwendung jeder Größe ist das scheiße und es nimmt Ihnen auch einen großen Vorteil der Quellcodeverwaltung kann nicht wirklich nur durch git zu einem vollständigen früheren Projektstatus zurückkehren.

Die .pbxproj-Datei ist einfach eine Eigenschaftsliste (ähnlich wie XML). Erfahrungsgemäß besteht der einzige Zusammenführungskonflikt, den Sie jemals hatten, darin, dass zwei Personen gleichzeitig Dateien hinzugefügt haben. Die Lösung in 99% der Fälle von Zusammenführungskonflikten besteht darin, beide Seiten der Zusammenführung beizubehalten, was für git zumindest einfach das Entfernen von >>>>, <<<< und ==== Zeilen beinhaltet. Tatsächlich ist dies so häufig, dass ich ein einfaches Shell-Skript erstellt habe, um eine .pbxproj-Datei in einem Zusammenführungsstatus von git zu reparieren. Ich führe dies aus dem Projektverzeichnis (auf Klassenebene) aus:

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

Im schlimmsten Fall, wenn es fehlschlägt (Sie bitten XCode, das Projekt zu laden, und es kann nicht geladen werden), löschen Sie einfach die .pbxproj-Datei, checken den Master von git aus und fügen Ihre Dateien erneut hinzu. Aber ich habe das in vielen Monaten der Verwendung mit diesem Skript noch nie erlebt und wieder mit mehreren anderen Entwicklern Vollzeit an iPhone-Anwendungen gearbeitet.

Eine weitere Option (auf die in den Kommentaren unten hingewiesen wird), die Sie anstelle des Skripts verwenden können, besteht darin, diese Zeile einer .gitattributes-Datei hinzuzufügen:

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

Dann nimmt git immer beide Seiten einer Zusammenführung für die .pbxproject-Dateien in Anspruch und hat den gleichen Effekt wie das Skript, das ich nur ohne zusätzliche Arbeit bereitgestellt habe.

Zuletzt ist hier meine vollständige .gitignore-Datei, die zeigt, was ich ignorieren soll, da es ein paar Dinge gibt, die Sie nicht wollen - in meinem Fall wirklich nur Emacs-Überreste und das gesamte Build-Verzeichnis:

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

# old skool
.svn

# osx noise
.DS_Store
profile
Kendall Helmstetter Gelner
quelle
3
Verwenden Sie für Ihr xcode-Projekt überhaupt eine .gitattributes-Datei? Und vielen Dank für Ihren Einblick. Ich denke, es wird in Zukunft viel einfacher sein, die pbxproj-Dateien zusammenzuführen.
Rickharrison
1
Bisher waren wir nicht, obwohl einige Aspekte davon interessant aussehen - aber die Leute, mit denen ich gearbeitet habe, waren keine fortgeschrittenen Git-Benutzer, und daher ist die Befürwortung erweiterter Funktionen nicht stark.
Kendall Helmstetter Gelner
1
"Die .pbxproj-Datei ist einfach JSON (ähnlich wie XML)." Tatsächlich handelt es sich um eine OpenStep-formatierte Eigenschaftsliste. Dieselben Grundideen wie JSON, aber die Syntax unterscheidet sich an einigen Stellen.
Peter Hosey
1
Eine andere Sache zu versuchen - setzen Sie merge = union: stackoverflow.com/questions/2729109/…
Kendall Helmstetter Gelner
1
Ich bin mit @KendallHelmstetterGelner einverstanden. Anstatt Ihr Skript auszuführen, das diese speziellen Zeilen entfernt, können Sie Ihr .gitattribute mit dem unionSchalter aktualisieren : *.pbxproj text/plain -crlf -diff -merge union.
Besi
9

Dies funktioniert bei mir in Xcode 4.6 und Git 1.7.5.

Fügen Sie die .gitattributes-Datei hinzu und schreiben Sie sie fest:

*.pbxproj binary merge=union

Ich habe dies mit einem anderen Teammitglied getestet und es funktioniert großartig.

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

oneyenjug
quelle
Merge = union ist gut, aber das mergepbx-Tool sollte die akzeptierte Antwort sein.
Alper
8

Ehrlich gesagt sind die vorhandenen Antworten irreführend.

Wenn Sie niemals Dateien löschen oder umbenennen merge=union, ist es eine gute Idee , die Strategie zu verwenden, bei der die Unterschiede in verschiedenen Commits direkt kombiniert werden.

In der realen Welt müssen wir jedoch manchmal Dateien löschen oder umbenennen. Das Zusammenführen der Unterschiede ohne Änderungen würde in diesen Situationen viele Probleme verursachen , und diese Probleme führen normalerweise zum Problem "Integrität des Arbeitsbereichs - Projekt konnte nicht geladen werden", wodurch Sie das Projekt sogar nicht ausführen können.

Die beste Lösung, die ich bisher bekommen habe:

1) Entwerfen Sie das Projekt gut und fügen Sie zu Beginn alle erforderlichen Dateien hinzu, sodass Sie die selten ändern müssen project.pbxproj.

2) Machen Sie Ihre Funktionen winzig. Mach nicht zu viele Dinge in einer Filiale.

3) Wenn Sie aus irgendeinem Grund die Dateistruktur ändern und Konflikte verursachen müssen project.pbxproj, verwenden Sie Ihren bevorzugten Texteditor, um sie manuell zu lösen. Wenn Sie Ihre Aufgaben winzig machen, können die Konflikte leicht gelöst werden.

Brian
quelle
3

Die kurze Antwort lautet: Selbst wenn Sie diese Zeile .gitattributesnicht einfügen, können Sie möglicherweise zwei geänderte Versionen eines .pbxproj nicht einfach zusammenführen. Es ist besser für Git, es als Binärdatei zu behandeln.

Siehe hier für Details: Git und pbxproj

Update: Auch wenn das Git-Buch dieser Antwort noch zustimmt , mache ich das nicht mehr. Ich kontrolliere meine Version .pbxprojwie jede andere nicht-binäre Quelldatei.

Tom
quelle
Klingt so, als könnten Sie einen Festschreibungsfilter einrichten, durch den die Datei simplejsongesendet wird, oder einen solchen aufgeräumten Filter auf dem Weg zum Index. Es würde jedoch immer noch nicht garantiert sein, dass es funktioniert.
Intuition
1
Es ist keine JSON-formatierte Datei. Sieht ähnlich aus, hat aber viele Unterschiede im Detail.
Eonil
Es sagt sein JSON im Git-Buch, aber es sieht so aus, als ob es falsch ist. git-scm.com/book/ch7-2.html
huggie
1
OK. .pbxprojDie Datei ist eigentlich eine NeXT / Cocoa PList-Datei im alten Stil, die älter ist und viel früher als JSON definiert wurde und jetzt von Apple nicht mehr unterstützt wird. (aber sie verwenden es immer noch an einigen Stellen) Die Erwähnung der Datei im Buch ist völlig falsch. Ich habe die Abstimmung entfernt, weil Sie dies ausdrücklich erwähnt haben.
Eonil
2

Ich habe ein Python-Skript erstellt, das Zusammenführungskonflikte in XCode-Projektdateien behandeln kann.

Wenn Sie es ausprobieren möchten, können Sie es hier überprüfen: https://github.com/simonwagner/mergepbx

Sie müssen es als Zusammenführungstreiber installieren, damit es automatisch aufgerufen wird, wenn in Ihrer Projektdatei ein Zusammenführungskonflikt auftritt (in der README.md erfahren Sie, wie das geht).

Es sollte viel besser funktionieren, merge=unionals mergepbxdie Semantik Ihrer Projektdatei zu verstehen, und wird daher den Konflikt korrekt lösen.

Das Projekt ist jedoch immer noch Alpha. Erwarten Sie nicht, dass es jede Projektdatei versteht, die es gibt.

Simon
quelle