1. ホーム
  2. ios

[解決済み] XcodeでGitを正しく使うには?

2023-02-02 07:44:51

質問

私はしばらくiphoneの開発者をしていますが、最近、ワークフローにgitを取り入れるようになりました。 私は、以下のサイトにあるgitの設定を使用しています。 http://shanesbrain.net/2008/7/9/using-xcode-with-git にあるgitの設定を使用しています。

この設定は、マージから*.pbxprojを除外するようにgitに伝えていますか? これを行う本当の理由はあるのでしょうか? たとえば、私がプロジェクトにファイルを追加して origin にプッシュすると、仲間の開発者がプルするときにそのファイルは彼らの xcode プロジェクトに追加されません。 そして、彼らのうちの一人がリリースをビルドした場合、このファイルは含まれないかもしれません。 プロジェクトファイルのマージは git に任せてはいけないのでしょうか? このファイルがマージされるべきなのか、されないべきなのか、また、ファイルがプロジェクトに追加されたときに状況を適切に処理するにはどうしたらよいのでしょうか?

どのように解決するのですか?

私は SDK が発売されて以来、フルタイムで iPhone アプリケーションに携わってきました。

真実は、その .pbxproj ファイルのマージを禁止することは、役に立つというよりも、はるかに有害だということです。 あなたが言うように、他の人がそのファイルを取得しない限り、あなたがファイルを追加すると、他の人もそれを自分のプロジェクトに追加しなければなりません - どんな規模のアプリケーションでも、それは最悪で、また、git によってのみ完全に以前のプロジェクトの状態に戻すことができないという、ソース コード管理の大きな利点を奪っています。

.pbxproj ファイルは単にプロパティ リストです (XML に似ています)。 経験上、マージの競合は、2 人の人間が同時にファイルを追加した場合にのみ発生します。 少なくともgitの場合は、>>>>, <<<, ====の行を削除するだけです。 実際、これは非常によくあることなので、私は git からマージ状態の .pbxproj ファイルを修正する簡単なシェル スクリプトを作成し、プロジェクト ディレクトリ内(クラス レベル)でこれを実行するようにしました。

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

最悪、失敗した場合(XCodeにプロジェクトの読み込みを要求して、読み込みに失敗した場合)、単に.pbxprojファイルを削除し、gitからマスターをチェックアウトして、ファイルを再追加すればよいのです。 しかし、私はこのスクリプトを何か月も使用していて、また他の何人かの開発者とともに iPhone アプリケーションにフルタイムで取り組んでいますが、そのようなことが起こったことは一度もありません。

スクリプトの代わりに使用できる別のオプション (以下のコメントで指摘されています) は、.gitattributes ファイルに次の行を追加することです。

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

そうすると、git は常に .pbxproject ファイルに対してマージの両側を行うようになり、余計な作業をせずに、私が提供したスクリプトと同じ効果を得ることができるのです。

最後に、これは私の完全な .gitignore ファイルで、無視するように設定したものを示しています。私の場合、本当に emacs の残骸と構築ディレクトリ全体です。

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

# old skool
.svn

# osx noise
.DS_Store
profile