web-dev-qa-db-ja.com

Xcodeは変更されていないストーリーボードとXIBファイルを変更します

ストーリーボードは、Gitワークフローの観点からすると、複数の人がストーリーボードで共同作業をしている場合、かなりの苦痛です。たとえば、.storyboardファイル内のXMLの開始<document>タグのtoolsVersionおよびsystemVersion属性は、最新のファイルマニピュレーターが実行中の構成によって変更されます。全員のXcodeバージョンを正確に同期すると、toolsVersionに役立つように見えますが、systemVersionは、開発者が実行している特定のMacまたはOS Xバージョンに応じて、何があっても変わります。

これはばかげていますが、ほとんど無害です。ただし、心配なのは、git pullの後にストーリーボードを開くだけで、ストーリーボードに他の変更が自動的に行われる場合があることです。つまり、Aliceはストーリーボードに変更を加え、コミットしてリポジトリにプッシュします。その後、ボブはアリスの変更を引き出し、ストーリーボードを開いてさらに変更を加えます。彼がストーリーボードを開いた瞬間、ファイルアイコンはすぐに変更されたが保存されていない状態に変わり、git statusは奇妙な変更がいくつも発生したことを示します。これはすべて、ボブが何かを変更したり、自分でファイルを保存したりすることなく行われました。

最も一般的な自動化された変更は、ストーリーボードファイルの終わり近くで<classes>タグの階層全体が消失または再出現することです。何がこれを引き起こしているのかはまだわかっていません。さまざまな.lprojディレクトリにストーリーボードのローカライズされたバージョンがいくつかあり、それらをInterface Builderで開くと、クラス階層が一部から自発的に削除され、他に追加されるか、一部に残されます。これはgit diffで多くのノイズを引き起こしますが、実際には機能を損ないません。多くの場合、実際に行った変更をgitのインデックスに選択的に追加し、コミットしてから、自然な無意味な<classes>変更を破棄します。これは、コミットを小さくしてニースに保つためです。しかし、最終的には、Xcodeが変更を再実行し続けるため、気にするのはあまりにも多くなり、誰かが他の何かと一緒にそれらを激怒させます...他の誰かのXcodeが変更を元に戻そうと決めるまでは問題ありません明らかな理由。 (私たちのコミット履歴はこれについて多くの宣誓をしています。)

他の誰かがこの行動を見ていますか?これは、Xcodeのバグですか、それとも1つ以上の開発用Macでの構成の問題ですか? XIBファイルとの共同作業で同様の動作が見られましたが、ストーリーボードはこの影響を受けやすいようです。

128
JK Laiho

これはバグではなく、Xcodeがストーリーボードファイルを処理する方法の結果です。ストーリーボードファイルの差分およびマージプログラムを作成しています (GitHub link) そして、ストーリーボードファイルのロジックとXcodeの処理方法を分析するのに何時間も費やしました。これは私が発見したものです:

  • ストーリーボードファイルに奇妙な変更が発生するのはなぜですか?XcodeはNSXML APIを使用して、ストーリーボードファイルをNSSetベースの論理ツリー構造に解析します。 Xcodeは、変更を書き込む必要がある場合、論理ツリー構造に基づいてNSXMLDocumentを作成し、ストーリーボードファイルをクリアし、XMLDataWithOptions:を呼び出してファイルを再度埋めます。セットは要素の順序を保持しないため、わずかな変更でもストーリーボードXMLファイル全体が変更される可能性があります。

  • クラスタグが消えたり、ランダムに再表示されるのはなぜですか?<class>セクションは、内部Xcodeキャッシュにすぎません。 Xcodeはこれを使用して、クラスに関する情報をキャッシュします。キャッシュは頻繁に変更されます。 Xcodeが古いと思われる場合、クラス.h/.mファイルが開かれ、削除されると要素が追加されます(少なくとも古いXcodeはこのように動作します)。ストーリーボードを保存すると、キャッシュのcurrentバージョンがダンプされるため、<class>セクションが頻繁に変更されるか、表示されなくなります。

Xcodeをリバースエンジニアリングしていません。 Xcodeとストーリーボードファイルを試して、これらの観察を行いました。それでも、この方法で機能することはほぼ100%確信しています。

結論

  • キャッシュセクションは重要ではありません。変更は無視しても問題ありません。
  • すべてのフォーラムで見られるものとは異なり、ストーリーボードファイルのマージは複雑な作業ではありません。たとえば、ストーリーボードドキュメントでMyController1 View Controllerを変更したと仮定します。ストーリーボードファイルを開き、この<viewController id=”ory-XY-OBM” sceneMemberID=”MyController1”>のようなものを見つけます。このセクションの変更のみを安全にコミットし、他のすべてを無視できます。セグエまたは制約を変更した場合は、“ory-XY-OBM”が含まれているものもすべてコミットしてください。シンプル!
78
Marcin Olawski

これはXCode 4.5+のバグです。修正されることを望みます。はい、PITAです。

これがAppleの完全なバグです。

ストーリーボードファイルへのXcodeの無償編集を避ける方法?

17
deleted_user

この問題は、ストーリーボード、XIB、コアデータモデル、プロジェクトファイルなど、Xcodeで生成されたファイルでgit add -pを非常に慎重に使用することで多少軽減できます。実際のインターフェース/モデル/プロジェクト。

ストーリーボードで見た最も一般的なジャンクの変更は、システムのバージョン番号(おっしゃるとおり)と<classes>セクションの絶え間ない追加と削除です。 XIBの場合、それは<reference key="NSWindow"/>の追加と削除であり、Cocoa Touchのクラスではありません。ただすごい。

海のように考えてください:満潮と干潮の両方があります。洗い流してください

ああ。それだけです。

変更をステージングするときにこれらの変更を無視し、ジャンク変更をリセットし、クリーンコミットを行うことができます。

技術的な観点からXIBよりもストーリーボードで見た唯一の利点は、AppleはFileMergeが競合するストーリーボードのマージを拒否することをまだ廃止していないことです。新しいバージョンはそれを壊しました。Thxxxxみんな???? !!!)

http://bugreporter.Apple.com/ !でこれらの問題のすべてに関する多くのバグを報告してください。 OpenRadar にエントリを作成することを忘れないでください。

11
Phil Calvin

この状況が大幅に改善されたため、ここで別の答えを投げます。 StoryBoardを表すXIBファイルのXMLは大幅に簡素化されました。

また最近、私は弾丸をかみ、Xcode to Source Controlのインターフェイスの使用を開始しました。私は何年もコマンドラインを使用してきましたが、インターフェースはナイスであり、コミットを分割できます。これは、コミットにリンクするチケットシステムを使用する場合に非常に重要です。

とにかく、今日、ストーリーボードに変更があり、組み込みの差分がドキュメントタグ(systemVersion)の単一の属性であることを示していることに気付きました。大したことではありません。

私は、SBがチームのマージ問題のためにチームで禁止されていると人々が言う記事を読みました。完全な狂気。特に、インテリジェントな自動レイアウトが組み込まれているので、それらは非常に驚くべきものであり、使用していない場合は本当に見逃しています。

6
Rob

whyこの狂気が起こっていることを知っておくと役立ちますが、プロジェクトに警告を付けないことを信じており、プロジェクトを健全な状態に戻すために迅速かつ汚いだけが必要な場合:

  1. 明示的に指示されるまで、何もコミットしないでください。

  2. Xcodeを開き、新しいストーリーボードを作成します(コマンド+ N> iOS>ユーザーインターフェイス>ストーリーボード)。デフォルト名のStoryboard.storyboardと呼ぶことにします。

  3. Xcodeが違反したストーリーボードを開きます。これはBase.lproj/Main.storyboardであると仮定します。

  4. ストーリーボード上のすべてを選択してコピーします(Command + A、次にCommand + C)。

  5. Storyboard.storyboardを開きます。

  6. すべてをコピーしてStoryboard.storyboardに貼り付けます。

  7. Xcodeを閉じます。

  8. ターミナルを開き、ディレクトリをリポジトリに変更します。

  9. Main.storyboardStoryboard.storyboardmv Storyboard.storyboard Base.lproj/Main.storyboard)に置き換えます。

  10. git add Base.lproj/Main.storyboard; git commit -m "Fix Xcode's insanity."

  11. project.pbxproj経由のgit checkout -- project.pbxprojへの変更を無視します。ファイルをgit diffすると、一時的なストーリーボード(もはや存在しない)に関する情報が追加されたことがわかります。

  12. Xcodeを開いて、警告が消えたことを確認します。

  13. 呼吸する。

3
Kayce Basques