一般的なマージの問題

エンジンの新規ビルドをマージする際によく発生する問題の説明

Windows
MacOS
Linux

ツール

以下は、Unreal Engine 4 の QA 承認ビルドをマージ、統合するために推奨されるツールです。

  • Araxis Merge: http://www.araxis.com/merge/

  • Perforce: http://www.perforce.com/

マージ

Araxis Merge などのツールは、マージ処理に非常に役立ちます。Perforce などのバージョン管理システムに統合し、ビルトイン ツールのかわりに Araxis が diff/merge を行うようにすることができます。

コード ドロップのマージでは、Araxis Merge のフォルダの比較 (二方向と三方向の両方) が、現行プロジェクトと最近の QA 承認ビルド (場合によっては過去の QA 承認ビルド) との比較に役立ちます。この方法を使用すると、 QA 承認ビルドと現行プロジェクトで何が進化したかを確認することができます。

マージの際に、Perforce などのバージョン管理システムでのブランチングは有用です。マージ関連のすべての変更を別のブランチで行うことで、完全にマージした変更を統合する準備が整うまで (通常、リグレッション テストを実施し、すべての問題が解決した後まで) ベース ブランチをクリーンに保ちます。

もちろん、このエンジンで作業する場合は、何もかもをベースに詰め込むよりも、モジュール式アプローチをとる方法が常にベストプラクティスです。できる限りベースをクリーンに保つことが、マージ関連のバグを減らすことになります。

マージしたコードを管理する他の戦略としては、セクションが変更されたことを簡単に識別できるように明確なコメントをベースのビルド コードに必ず入れるようにします。

//myproject - modifying base code...

以下のようにプロジェクトに #define を追加することも有用です。

#define YOURGAME 1

次に、ベース エンジン コードにあるカスタム コードで囲みます。

#ifdef YOURGAME
   //myproject - doing custom stuff here...
#endif // YOURGAME

理想としては、何もかもを定義せずに、汎用のビルドを持つことができたらと思うでしょうが、それは必ずしも可能ではありません。

しかし、こうしたテクニックはマージ作業をかなりやりやすくするはずです。

統合

各 QA ビルドには多くの素晴らしい変更が加えられています。その中には、多くのファイルに手を加えているものがあり、それがマージ作業を少々やっかいなものにするかもしれません。

こうした問題に取り組む良い方法は、Perforce で統合機能を利用することです。

  1. QA ビルドのためにご利用のデポで領域を作ります (例、//depot/UE4Builds/...)。

  2. 新しい QA ビルドがでたらダウンロードし、デポにサブミットします。

    ファイルの追加 / 削除 / 編集のすべてのサブミットを行う場合、以下のコマンドを使用するのが良い方法です。 REM PURPOSE: デフォルトのクライアントスペックにあるデフォルトのチェンジリストが空であることを確認してください。

    REM takes 2 variables
    
    REM %1 == the hard drive PATH (under the depot root) to the dir with the new version (e.g. c:/foo/bar/baz)
    REM %2 == the depot path to the build (e.g. //depot_foo/bar/baz/...
    REM USAGE:  p4ModifiedFiles.bat c:/foo/bar/baz //depot_foo/bar/baz/...
    
    REM save state
    
    set MODFILES_FIND_ORIG=%MODFILES_FIND%
    set MODFILES_FIND=C:\bin\cygwin\bin\find.exe
    REM find all of the new files and add them
    
    %MODFILES_FIND% %1 -type f | p4 -x - add
    REM open all changed files for edit
    
    p4 diff -se %2 | p4 -x - edit
    REM open all removed files for delete
    
    p4 diff -sd %2 | p4 -x - delete
    REM restore state
    
    set MODFILES_FIND=%MODFILES_FIND_ORIG%
  3. Perforce の統合 (p4 integ) を使用して、//depot/UE4Builds/... から Perforce のご利用のエンジンに統合します (例、 //depot/MyEngine/...) 。

  4. Perforce の Safe Automatic Resolve を使用して、ユーザーがローカルで変更していないファイルを自動的に解決 (resolve) します。(例、著作権の更新は基本的にすべてのファイルに影響します。その多くは、ローカルでは変更されません。)

リファレンス: http://www.perforce.com/perforce/doc.062/manuals/p4wsad/topics/resolving.html

Safe Automatic Resolveあなたのファイル (上記参照先の説明によると、ユーザーがチェックアウトし、ワークスペースで変更したファイルのバージョンのことを意味する) または彼らのファイル (他のユーザーが加えた変更を含むデポ内の最新バージョンのファイルを意味する) がベースファイルとは異なる場合、当該ファイルの差分バージョンをヘッド リビジョンとして受け入れてください(あなたのファイルと彼らのファイルの両方がベースファイルとは異なる場合には、これは該当しません)。両方のファイルがベースファイルとは異なる場合、そのファイルで解決 (resolve) を行わないでください。

ブランチ

コード側とコンテンツ側の双方でのブランチの中で変更を最小限に抑えるために、できる限り遅い段階でブランチするのが一般的なポリシーです。

一度、ブランチしておくと、ブランチで行われた変更を維持するのに役立ちます。多くの場合、特定のブランチに加えられた変更を統合し、適宜関連する変更をマージする担当者を必要とします。

エラーとトラブルシューティング

"Not a class or namespace name" エラー

症状: FooClass.h ファイルの DECLARE_NATIVE_TYPE() マクロにあるクラスの "not a class or namespace name" エラー。問題となっているクラスは、その上位で FooClasses.h ファイルで宣言されています。しかし、おそらくこのファイルがインクルードされる場合、有効な #defines が原因で、この宣言を見ていません。

原因: LaunchEngineLoop.cpp (NAMES_ONLY が定義されている) に含まれる自動生成されたヘッダは、プリコンパイルされたヘッダ (NAMES_ONLY が定義されていない) には含まれておらず、コンパイル エラーが発生しました。

修正 / 回避策: NAMES_ONLY を定義した状態でプリコンパイルしたヘッダに自動生成したヘッダを含みます。

参照: https://udn.epicgames.com/lists/showpost.php?list=unprog3&id=10516

列挙型変数のクラッシュ

症状: ライセンシーと Epic が同じ値で列挙型変数を追加しました。

原因: 列挙型変数は、名前ではなく値によってシリアライズされます。

修正 / 回避策: 回避策の 1 つとして、コンテンツをパッチするコマンドレットを作成する方法があります。しかし、これはエラーを発生しがちな時間がかかるタスクです。ライセンシーにとってより良い短期的な回避策は、列挙型変数にパディングすることです。これは、 C++ で、列挙型変数でオフセットを指定して簡単に行うことができます。しかし、ブループリントでは、エントリのパディングは手作業で行わなければなりません。

この問題の解決策は、値毎ではなく、すべての列挙型変数を FName としてシリアライズするエンジン レベルの変更を加えることです。未処理タスク:41337です。この変更をすると列挙型変数の名前変更がむずかしくなります。ただ、このケースは一般的ではありません。

参照: https://udn.epicgames.com/lists/showpost.php?list=unprog3&id=21598

Select Skin
Light
Dark

Welcome to the new Unreal Engine 4 Documentation site!

We're working on lots of new features including a feedback system so you can tell us how we are doing. It's not quite ready for use in the wild yet, so head over to the Documentation Feedback forum to tell us about this page or call out any issues you are encountering in the meantime.

We'll be sure to let you know when the new system is up and running.

Post Feedback