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?
quelle
Antworten:
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:
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:
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:
quelle
union
Schalter aktualisieren :*.pbxproj text/plain -crlf -diff -merge union
.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:
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
quelle
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.quelle
Die kurze Antwort lautet: Selbst wenn Sie diese Zeile
.gitattributes
nicht 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
.pbxproj
wie jede andere nicht-binäre Quelldatei.quelle
simplejson
gesendet wird, oder einen solchen aufgeräumten Filter auf dem Weg zum Index. Es würde jedoch immer noch nicht garantiert sein, dass es funktioniert..pbxproj
Die 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.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=union
alsmergepbx
die 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.
quelle