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


132

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

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

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

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


実際、XcodeプロジェクトとGitは一緒にうまく機能していません。不要な変更を破棄する以外に、この混乱を回避できないと思います。ほとんどの場合、プロジェクトファイルの変更と、変更していないと確信している他のxmlファイルです。なんらかの「解決策」があれば嬉しいです。Xcodeがあまり変更されないようにする便利なロック機能のためにPERFORCEが好きです。変更しないファイルを確認するためだけに手動で行う可能性があります。
A-Live

3
gitなどでストーリーボードを使用する価値はありません。彼らはコミットフレンドリーになるように設計されていません。私たちはあきらめ、.xibを使用しましたが、これもそれほど優れたものではありませんが、少なくとも詳細なものです。
ahwulf

多くの場合、ストーリーボードはかなりきれいに整理されていますが、XIBと組み合わせる必要があることがよくあります。このバグが修正された場合は、ほとんどの場合、これらのバグに対応できれば幸いです。
JK Laiho

私はahwulfのコメントにコメントする必要があります:世界で彼らはコミットフレンドリーではないとはどういう意味ですか?それらはXML /テキストファイルであり、それはあなたが得ることができるのと同じくらいコミットフレンドリーです。そして、ストーリーボードとバージョン管理システムに「問題」はありませんでした。唯一の問題はもちろん、xcodeが<classes>タグを削除して後で読み取ることですが、変更を確認すると簡単に確認できますgit GUIまたはgit -pまたは同等のすべてのdvcs。私は.pbxprojファイルをfyiとして使用したことがありません。
mgrandi 2013年

xcodeがクラスファイルを読み取ってブロックを生成できるのに、なぜクラスブロックをストーリーボード内に配置するのか理解できません。それらは一種の「キャッシュ」ですか?もしそうなら、それらをclasses.cacheファイルに入れて、バージョニングから除外できるようにします...
hariseldon78

回答:


78

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

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

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

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

結論

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

9
xcode diff / mergeツールの更新はありますか?このコミュニティにとって非常に便利なようです。
トニー

1
アプリは私のウェブページから入手できます(プロファイルを参照)。アプリは100%無料です。
Marcin Olawski 2013年

1
私にとってストーリーボードを可能な限り分割する== XIBを使用します。あなたはすべてをスライスしたい場合は、それがより簡単に、より良いXIBs使用する
マルチンOlawski

7
「私はXcodeをリバースエンジニアリングしていません。Xcodeとストーリーボードファイルを試して、これらの観察を行いました。」それ(浅い)リバースエンジニアリングであり、それはクールです。:-)
Constantino Tsarouhas

13
「これはバグではありません。これは、Xcodeがストーリーボードファイルを処理する方法の結果です。」敬具、この文の後半は、最初の文を説明したり、合理化したりするものではありません。「これはバグです。これはXCodeが.xibファイルを処理する方法の結果です[残念ながら未解決で非常に迷惑です]」。XCode 5.xから6.2まで(今日、150311)、. xibファイルは開発者によってまったく変更されず、単にIBで表示されるだけで、不必要なxmlの変更が発生します。これは、生産性に影響を与える大きなバグです。「NBD、ただgitでチャンクを処理する」のような応答では、私は言葉を発しません。
cweekly 2015年

18

これはXCode 4.5以降のバグです。修正されることを願っています。もちろん、PITAです。

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

ストーリーボードファイルへのXcodeの不要な編集を回避する方法


1
4.6でも同じです。多分それはバグではありません。
Thromordyn 2013年

4.6.3にはまだあります。ストーリーボード/ xibsがうまく機能したとは言えません
houbysoft 2013

1
「それはバグではなく、機能です」:-S
MrTJ

これがバグであるという証拠はありません-煩わしいですが、それはXcodeがどのように動作するのかだけかもしれません
Thomas Watson

1
7.0.1では、これに変更はありません。
Andris Zalitis 2015年

11

この問題はgit add -p、ストーリーボード、XIB、コアデータモデル、プロジェクトファイルなど、Xcodeで生成されたファイルを非常に慎重に使用することである程度軽減できます。これらはすべて、実際のインターフェース/モデル/に影響を与えない同様の一時的な変更の影響を受けます。事業。

私がストーリーボードで目にした最も一般的なジャンク変更は、システムのバージョン番号(ご指摘の<classes>とおり)とセクションの継続的な追加と削除です。XIBの場合、これはの追加と削除であり<reference key="NSWindow"/>、Cocoa Touchのクラスでさえありません。すごい。

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

ああ。それでおしまい。

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

技術的な観点からXIBよりもストーリーボードを使用した場合の唯一の利点は、競合するストーリーボードのマージを拒否するためにAppleがまだFileMergeを無効にしていないことです。(FileMergeは以前はXIBをマージすることができましたが、新しいバージョンはそれを壊しました。Thxxxxの人たち💜!!!)

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


6

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

私はまた、最近弾丸をかみ、Xcodeのソース管理へのインターフェースを使い始めました。私は何年もコマンドラインにいて満足していますが、インターフェースは素晴らしく、コミットを分割することができます。これは、コミットにリンクするチケットシステムを使用する場合に非常に重要です。

とにかく、今日、ストーリーボードに変更があったことに気づき、組み込みのdiffは、それがドキュメントタグ(systemVersion)の単一の属性であることを示しました。だから大したことではない。

私は、SBがマージの問題のためにチームで非合法化されたと人々が言っ​​ている記事を読みました。完全な狂気。それらはとても素晴らしいです、特に今それらはインテリジェントな自動レイアウトが組み込まれているので、あなたがそれらを使用しなければあなたは本当に見逃しています。


3

この狂気が起こっている理由を知ることは役に立ちますが、プロジェクトを警告なしに保つことを信じており、プロジェクトを健全な状態に戻すために早急に汚いことを望む人のために:

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

  2. Xcodeを開き、新しいストーリーボードを作成します(コマンド+ N> iOS>ユーザーインターフェイス>ストーリーボード)。私はそれをデフォルトの名前と呼んでいると仮定しますStoryboard.storyboard

  3. Xcodeが違反したストーリーボードを開きます。これはそうだと思いますBase.lproj/Main.storyboard

  4. ストーリーボード上のすべてを選択してコピーします(コマンド+ A、続いてコマンド+ 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.pbxprojviaへの変更を無視しますgit checkout -- project.pbxprojgit diffファイルの場合、一時的なストーリーボード(存在しない)に関する情報が追加されたことがわかります。

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

  13. 呼吸する。


0

同じストーリーボードで作業しても問題ありません。しかし、プル/マージで競合を引き起こす同じビューコントローラで作業することは恐ろしいことです。大規模なチームで同じビューコントローラーを使用することは避けられません。

良いことに、ほとんどの場合、XML構造を理解していれば、同じビューコントローラの競合を修正できます。チームで作業中にこれらをマージするのに失敗したことはありません。ビューコントローラーを使用しているとします。現在、ビューは空白です。ソースコードオプションからビューコントローラのxml構造を確認してください。

ここに画像の説明を入力してください

ストーリーボードは、ドキュメントタイプタグで囲まれたxmlです。ストーリーボードのすべてがシーンに含まれていますsceneID =タグ。シーンタグはすべてのビューコントローラーを保持します。それが基本です。

ここで、UILabelとUIButtonをビューに追加しました。要素の自動レイアウトも設定します。これは次のようになります。

ここに画像の説明を入力してください

レベル/ボタンをビューコントローラーに追加すると、ビューのサブビュータグ内にいくつかの新しいコードが追加されました。同じことが、要素の追加やUIの変更にも当てはまります。競合を修正するために本当に重要なタグ構造を注意深く確認してください。

次に、ストーリーボード名Homeviewcontrollerに別のビューコントローラーを追加します。新しいビューコントローラを追加するということは、シーンタグの下に新しいシーンを追加することを意味します。これを見てください:

ここに画像の説明を入力してください

この時点で、構造をランダムに変更し、問題/警告を観察します。最初のビューコントローラーラベルの終了タグを変更し、ファイルを保存します。それを実行して警告を見てください。23行目から作成された終了タグが正しくないというエラーが表示されます。23行目では、ラベル制約が終了タグなしで設定されていることがわかります。それが問題です。次に、終了タグを配置してプロジェクトをビルドします。終了タグを設定すると、ストーリーボードを正常に表示できます。

ここに画像の説明を入力してください

競合の警告が表示された場合は、以前のソースと比較して、ソースを変更してください。古いコードや冗長なコードを削除し、新しいコードを適切なタグの開始と終了で保持し、修正を行います。

[注、時間を取得したら、さらにいくつかのテストケースで回答を更新します]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.