[解決済み] XcodeでGitを正しく使うには?
質問
私はしばらく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
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] Git で、ステージされていない変更を破棄するにはどうしたらいいですか?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Objective-Cでデリゲートを作成するにはどうしたらいいですか?
-
[解決済み] Xcode 12、iOS Simulator用にビルドしても、iOS用にビルドされたオブジェクトファイルでは、アーキテクチャ「arm64」用にリンクされます。
-
[解決済み] UIViewController のビューが表示されているかどうかを確認する方法
-
[解決済み] UITextFieldのテキスト変更イベント
-
[解決済み] iOS 13 のフルスクリーンでモーダルを表示する
-
[解決済み] iPhone UITextField - プレースホルダーの文字色を変更する
-
[解決済み] iOS Simulatorでネットワークを無効にすることは可能ですか?
-
[解決済み] UILabelで複数行のテキストを表示する
-
[解決済み] NSNotificationCenterのaddObserver in Swift
-
[解決済み] Swiftの配列を文字列に変換するには?