`
阅读更多

 

最近 UE4 项目从 SVN 迁移到 git ,配合其他工具完成 CI/CD 的自动化过程,迁移后遇到非常奇怪的问题:

行为描述 写道
1、SVN 下工程编译且运行时正常。

2、迁移到 git 仓库后, pull 下来到本地仓库,编译且运行时正常。

3、本地 git 仓库内工程编辑代码文件,哪怕是换行符或加注释,编译正常,运行时异常,具体表现为多个地方,比如容器明明有值却突然变成空值,像被 GC 回收一样,堆栈又没有产生回收,UI 等显示也异常等。

4、回到 SVN 下打开工程修改文件,加换行或加注释,编译且运行时正常。

5、删除本地 git 仓库下的 .git 文件夹,编译且运行时正常,恢复删除的 .git 文件夹,编译正常但运行时不正常。
 

通过测试和验证,基本与 .git 相关。只需删除 .git 文件夹,然后构建成功。成功后,移回 .git 文件夹构建错误重复出现。

 

于是开始另一种验证进一步确认:关闭 UE4 的源代码管理,以及 VS2019 的源代码管理。结果毫无影响,问题依旧存在。

 

那么 .git 文件夹下的文件到底是因为什么对编译没有产生错误或警告,对项目 Editor 或 Shipping 运行时造成影响呢?

 

一开始以为是跟 encoder 相关,SVN 项目中的文件在开发时,没有关注编码格式,许多文件为 gb2312、unicode、ascii 等编码格式。

 

git 服务器默认采用 utf8 格式。

 

于是采用了多种方式从 vs2019 中尝试将项目代码文件转换成 utf8(no-BOM)。转换都是成功的,无奈只要重新打开工程,那些转换编码成功的文件又会自动改变为原来格式。

 

1、尝试过使用“高级保存选项”(工具 - 自定义 - 【命令】选项卡 - 菜单栏选项选择【文件】- 添加命令 - 选择【文件】类别 - 【高级保存选项】- 确定,然后就可以在 VS 的文件下拉框中看到该选项)更改文件编码格式。也可以使用 FileEncoding 工具,效果一样。(结果无效

 

2、尝试过使用第三方插件 EditorConfig 工具 使用 .editorconfig 文件配置,配置如下:

 

.editorconfig 写道
# Rules in this file were initially inferred by Visual Studio IntelliCode from the F:\Real3D\git-master\beta-2.x\Intermediate\ProjectFiles\ codebase based on best match to current usage at 4/13/2022
# You can modify the rules from these initially generated values to suit your own policies
# You can learn more about editorconfig here: https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference
# EditorConfig is awesome: http://EditorConfig.org

# EditorConfig file 所在目录是项目根目录,此目录及子目录下保存的文件都会生效
root = true

# 对于所有文件
[*]

# 缩进风格
indent_style = tab

# 缩进宽度
tab_width = 4

trim_trailing_whitespace = true
max_line_length = 120

# 文件编码格式
charset = utf-8

# 行尾格式,Windows 一般为 CRLF,Linux 一般为 LF,根据需要更改
end_of_line = crlf

# 文件结尾添加换行符,以防警告
insert_final_newline = true

# UE4 project file
[*.uproject]
indent_style = space
indent_size = 2

# Module target files
[*.cs]
indent_style = tab

# C++ source files
[{**.cpp,**.h}]
indent_style = tab

 

 

 .editorconfig 文件需要放到工程根目录下。这种方式非常适合更改所有的文件编码格式。(结果无效

 

 以上方式 VS 还是无法设置默认编码格式,并对文件生效。

 

于是检查 WIndows10 系统的语言编码。在【设置】- 【时间和语言】-【语言】-【管理语言设置】-【更改系统区域设置】- 勾选【使用 Unicode UTF-8 提供全球语言支持】。确定和应用,重启系统,系统即变为 UTF8 编码。

 

问题仍未解决。编译正常但运行时异常。

 

git add 提交到仓库,警告:warning: LF will be replaced by CRLF in ...

LF 是 linux 和 Unix 系统的换行符,CRLF 是 window 系统的换行符。而 git 为跨平台项目提供了“换行符自动转换”的功能,默认开启。该功能会自动把文件改成当前系统的换行方式。因此会提示 git 修改了该文件。可以使用以下将换行符关掉:

git config core.autocrlf false (仅对当前git仓库有效)

git config --global core.autocrlf false (全局有效,不设置推荐全局)

然后提交到服务器。

 

再次 pull ,编译正常但运行时异常。

 

现在工程文件全部改成 utf8 了,系统 编码格式也改成 utf8了。那到底原因在哪呢?跟 encoder 有关系吗?回过头我们看一下 UE4 对字符 encoder 的描述:

 

1、文本格式。包括 ASCII(P4 类型文本,检入时通过 P4 触发器验证)、ANSI(ASCII 和当前代码页以二进制形式存储在 P4 服务器上)、UTF-8(ASCII 超集,P4 类型 Unicode)、UTF-16(P4 类型 UTF-16,检入时通过 P4 触发器验证)。有几种格式可用来表示文本和字符串:二进制、文本、UTF-8、UTF-16。

 

格式 优点 缺点
二进制 不定义内部格式;无论什么格式都可以加载所有文件。 不能合并。
不定义内部格式,每个文件都可以采用不同格式。
P4 存储每个版本的完整内容,可能会不必要地使库大小膨胀。
文本 可合并。 限制性极强;仅允许ASCII字符。
UTF-8 仅访问我们将需要的所有字符。 亚洲语言有不同的内存描述文件。
使用较少内存。 我们的 P4 服务器上未启用 P4 类型 Unicode。
属于ASCII超集;纯ASCII字符串是完全有效的UTF-8字符串。 字符串运算更加复杂;必须解析字符串才能完成像长度计算一样简单的运算。
游戏检测到字符串是ASCII时仍能工作,并原样输出。 在亚洲区域,除了ASCII,MSDev对其他字符集的处理不太理想。因此我们才在检入期间将文本验证为ASCII。
如果我们有启用了Unicode的服务器,则文件将是可以合并的,并且不需要排他检出。
可以通过解析检测字符串是否是UTF-8(有或没有BOM)。
UTF-16 仅访问我们将需要的所有字符。 使用较多内存。
简单。内存占用是字符数的两倍 如果不包含BOM,则难以检测到这种格式。
简单。字符串运算可以拆分/合并,而不必解析字符串。 游戏检测到字符串是ASCII时无效,并原样输出(现在在检入时通过UTF-16验证器检测)。
与游戏中使用的格式相同,不翻译,不解析,也不需要内存运算。 在亚洲区域,除了ASCII,MSDev对其他字符集的处理不太理想。因此我们才在检入期间将文本验证为ASCII。
可合并。
C#在内部使用UTF-16。

 

 

2、UE4 内部字符串表示。

 

UE4 内部字符串作为 FString 或 TCHAR 数组以 UTF-16 格式存储在内存中,因此只支持基本多文种平面(Basic Multilingual Plane,简称 BMP,或称第零平面,是 Unicode 中的一个编码区段,编码从 U+0000 至 U+FFFF。),这样 UE4 内部编码可以更准确地描述为 UCS-2,字符串以适合当前平台的字节次序存储。当从磁盘序列化到程序包,或在联网期间序列化时,TCHAR 字符小于 0xff 的字符串均存储为一串 8 位字节,否则存储为双字节 UTF-16 字符串。序列化代码可以根据需要处理任何字节次序转换。

 

3、UE4 加载的文本文件。

 

虚幻运行时使用 UnMisc.cpp 中的 appLoadFileToString() 函数来读取外部文本文件,如 .INT 文件。主要操作由 appBufferToString() 函数识别 UTF-16 文件中的 Unicode 字节顺序标记(BOM),如果存在,则按任一字节次序作为 UTF-16 加载文件。BOM 不存在时作何处理则取决于平台。

在 Windows 上,使用默认的 Windows MBCS 编码尝试转换文本,并使用 MultiByteToWideChar(CP_ACP, MB_ERR_INVALID_CHARS...)。如果在非 Windows 平台上这种转换失败,则读取每个字节并填补到 16 位,形成 TCHAR 数组。

请注意,对于使用 appLoadFileToString() 加载的 UTF-8 编码文本文件,没有可以用于检测或解码的代码。

 

4、UE4 使用的文本文件。

 

引擎生成的大部分文本文件将使用 appSaveStringToFile() 保存。所有 TCHAR 字符都可以用单字节表示的字符串将存储为一串 8 位字节,否则存储为 UTF-16,除非传递了值为 true 的 bAlwaysSaveAsAnsi,在这种情况下,字符串将先转换为默认的 Windows 编码。该操作当前仅对着色器文件执行,以解决着色器编译器在处理 UTF-16 文件时存在的问题。

 

5、官方建议。

 

  • INT 和 INI 文件。按任一字节次序的 UTF-16。针对亚洲语言的默认 MBCS 编码(如CP932)在 Windows 上有效,但这些文件需要在 PS3 和 Xbox360 上加载,因此转换代码仅在 Windows 上运行。
  • 源代码。一般而言,我们不建议在 C++ 源代码中使用字符串文字,这类数据可以存储在 INT 文件中。
  • C++ 源码。UTF-8 或默认 Windows 编码。MSVC、Xbox360 编译器和 gcc 应该可以顺利处理 UTF-8 编码的源文件。在 Latin-1 编码的文件中,如果有高位字符,例如版权、商标或度数符号,则应当尽可能避免在源代码中使用这类文件,因为这种编码在多语言环境系统上会被破坏。第三方软件中有一些这种情况是无法避免的(如版权声明),因此对于 MSVC,我们禁止了警告 4819,否则在亚洲版本 Windows 上编译时会发生问题。
  • 用 Perforce 存储 UTF-16 文本文件。不需要使用文本,如果 UTF-x 文件被检入并存储为文本,将在同步后损坏。如果使用"二进制",则将文件标记为排他检出,可以检入 ASCII、UTF-8、UTF-16,这在引擎中可以正常工作。但是,二进制文件不能合并,因此如果文件不标记为排他检出,更改会重复出现。如果使用 "UTF-16",则确保没有人检入非 UTF-16 文件。"Unicode" 类型是 UTF-8,在这里对我们没有用处。Perforce 能够处理 UTF-16 和 UTF-8,但 p4 diff 将 UTF-8 文件中的 BOM 显示为可见字符。

 

6、转换例程。

 

UE4 有一些宏可以将字符串转换为各种编码或从各种编码转换字符串。

这些宏使用局部范围内声明的类实例,在堆栈上分配空间,因此保留指向这些宏的指针非常重要!它们仅用于将字符串传递给函数调用。

  • TCHAR_TO_ANSI(str)

  • TCHAR_TO_OEM(str)

  • ANSI_TO_TCHAR(str)

  • TCHAR_TO_UTF8(str)

  • UTF8_TO_TCHAR(str)

UnStringConv.h 中的助手类:

  • typedef TStringConversion<TCHAR,ANSICHAR,FANSIToTCHAR_Convert> FANSIToTCHAR;

  • typedef TStringConversion<ANSICHAR,TCHAR,FTCHARToANSI_Convert> FTCHARToANSI;

  • typedef TStringConversion<ANSICHAR,TCHAR,FTCHARToOEM_Convert> FTCHARToOEM;

  • typedef TStringConversion<ANSICHAR,TCHAR,FTCHARToUTF8_Convert> FTCHARToUTF8;

  • typedef TStringConversion<TCHAR,ANSICHAR,FUTF8ToTCHAR_Convert> FUTF8ToTCHAR;

使用 TCHAR_TO_ANSI 时还必须注意的是,不要假设字节数将等于 TCHAR 字符串长度。多字节字符集可能要求每个 TCHAR 字符占多个字节。如果您需要知道所产生字符串的字节长度,可以使用助手类,而不是宏。例如:

 

FString String;
...
FTCHARToANSI Convert(*String);
Ar->Serialize((ANSICHAR*)Convert, Convert.Length());  // FTCHARToANSI::Length() 返回已编码字符串的字节数,排除空终止符。

 

 

这些宏声明的对象拥有很短的生命周期。它们的主要用途是作为函数的参数,并且很适合用于这类情形。请不要把变量赋值给转换后的字符串内容,因为对象回超出范围,字符串会被释放。假如你的代码继续访问指向已释放内存的指针,那么就会导致报错。

 

 

7、Unicode 中的 ToUpper() 和 ToLower() 。

 

UE4 目前只能处理 ANSI。"大写字母"和"小写字母"信息应该在相应 unicode 字符中进行交叉引用以获得所需结果。

 

 

8、特定于东南亚编码的 C++ 源码说明。

 

UTF-8 和默认的 Windows 编码都可能会使 C++ 编译器出现问题,在运行单字节字符代码页的 Windows 上,如果 C++ 源代码包含东亚双字节字符编码如 CP936,则编译源代码时务必小心。

这些东亚字符编码系统使用 0x81-0xFE 表示第一个字节,使用 0x40-0xFE 表示第二个字节。第二个字节中的 0x5C 值将解译为 ASCII/latin-1 中的反斜杠,这在 C++ 中有特殊的含义。(将字符串文字中的序列进行转义,如果在行末使用则保持不断行)。
在单字节代码页 Windows 上编译这种源代码时,编译器不会考虑东亚双字节字符编码,这可能导致编译错误,甚至在 EXE 中产生错误。

 

 

// 单行注释:如果东亚注释末尾有0x5c,则会导致难以找到因为缺失行而引起的错误。
// EastAsianCharacterCommentThatContains0x5cInTheEndOfComment0x5c'\'
important_function(); /*这一行会作为注释的一部分与上一行连接起来*/

// 在字符串文字内部:这可能会导致字符串损坏或被识别的 0x5c 转义序列错误。
printf("EastAsianCharacterThatContains0x5c'\'AndIfContains0x5cInTheEndOfString0x5c'\'");
function();
printf("Compiler recognizes left double quotation mark in this line as the end of string literal that continued from first line, and expected this message is C++ code.");

 

 

如果 0x5c 后面的字符不指定转义序列,编译器会将转义序列字符集转换为一个指定的字符。(如果不指定,则结果是定义的实现,但 MSVC 会移除 0x5c,并发出警告"未识别的字符转移序列"。)
在上述情况中,字符串结尾有一个 0x5c 反斜杠,下一个字符是双引号,因此转义序列 \" 转换为字符串数据中的双引号,编译器继续产生字符串数据,直到遇到下一个双引号或文件结束,并引起错误。

危险字符示例:CP936(简体中文 GBK)"?" 是 0x815C,因此许多 CP936 字符都有 0x5C。

 

某些文本编辑器将 BOM 描述为签名(没有BOM的UTF-8)。

UTF-8 字符编码使用三个字节来表示东亚字符:0xE0-0xEF 表示第一个字节,0x80-0xBF 表示第二个字节,0x80-0xBF 表示第三个字节。如果没有 BOM,东亚 Windows 默认编码会将三个 UTF-8 编码字节和后面的一个字节识别为两个双字节东亚编码字符,第一个和第二个字节作为一对,表示第一个东亚字符,第三个和随后字节作为一对,形成第二个东亚字符。如果三个 UTF-8 编码字节后面的字符在字符串文字或注释中有特殊含义,则可能会发生问题。

 

 

// 在内嵌注释中:如果注释文本包含奇数个东亚字符,而下一个字符标记注释结束,则可能会导致与缺失代码有关的难以找到的错误。
//东亚代码页 Windows 上的编译器将 UTF-8 编码的东亚字符注释的最后一个字节和星号 * 识别为一个东亚字符,下一个字符仍被视为注释的一部分。在下述示例中,编译器移除了important_function(),因为它似乎是注释的一部分。这种行为是非常危险的,难以找到缺失的代码。
/*OddNumberOfEastAsianCharacterComment*/
important_function();
/*normal comment*/

// 在单行注释中:在东亚注释末尾使用反斜杠 "\" 会导致一些没有缺失行但却难以找到的错误。这是非常少见的情况,因为程序员不会故意在注释末尾使用反斜杠 "\"。
// OddNumberOfEastAsianCharacterComment\
description(); /* coder intended this line as comment, by using backslash at the end of above line */

//在字符串文字内部:如果字符串文字内包含奇数个UTF-8编码的东亚字符,并且以下字符有特殊含义,会导致字符串遭到破坏、错误或警告。
//东亚代码页Windows上的C++编译器将UTF-8编码的东亚字符串的最后一个字节和下一个字符识别为一个东亚字符。如果运气好,会看到编译器警告"C4819"(如果未禁用)或错误,提醒您发生了问题。如果运气不好,字符串会遭到破坏。
printf("OddNumberOfEastAsiaCharacterString");
printf("OddNumberOfEastAsiaCharacterString%d",0);
printf("OddNumberOfEastAsiaCharacterString\n");



 

 

总结: 您可以对 C++ 源代码使用 UTF-8 或默认 Windows 编码,但我们不建议在 C++ 源代码内部使用字符串文字。如果在 C++ 源代码中使用东亚字符编码,请确保使用东亚作为默认代码页。

另一种好方法是使用带有 BOM 的 UTF-8(某些文本编辑器将 BOM 描述为 Unicode 签名)。

 

返回到行为描述里,我们继续验证是否跟 encoder 有关,发现编码可以全部更改了,但是问题还存在(.git 文件夹下的文件对工程产生影响)。

 

 

.git 文件对 UE4 工程产生什么影响呢?

 

.git 文件夹 是 git init 后在当前目录生成的一个管理 git 仓库的文件夹,这里包含所有 git 操作所需要的东西:

 

写道
└── .git
├── COMMIT_EDITMSG # 保存最新的commit message
├── config # 仓库的配置文件
├── description # 仓库的描述信息,主要给gitweb使用
├── HEAD # 指向当前分支
├── hooks # 存放一些shell脚本,可以设置特定的git命令后触发相应的脚本
├── index # 二进制暂存区(stage)
├── info # 仓库的其他信息
│ └── exclude # 本地的排除文件规则,功能和.gitignore类似
├── logs # 保存所有更新操作的引用记录,主要用于git reflog等
├── objects # 所有文件的存储对象
└── refs # 具体的引用,主要存储分支和标签的引用

 

 经过反复尝试,.git 与 Build 过程中发生了一些事情,若本地 repo 未修改,它将编译正常,编译后打包运行或编辑器运行正常。若对本地 repo 产生更改(如代码中添加一个空格、换行或添加注释等),编译正常, 编译后打包运行或编辑器运行不正常。

 

如果将项目复制到没有 git 的单独文件夹中,则不会出现这些问题。

 

这可能与 UE4 尝试加载 .uproject 的 unity build (统一构建)有关,具体是 “使用 ‘git status’ 来确定自适应非统一构建的工作集”。

 

 

 Unity Build 默认是无需禁用的。可以通过 Target.cs 来禁用:

 

bUseUnityBuild = false;
bUsePCHFiles = false;
bUseAdaptiveUnityBuild = false;

 

 在添加了以上代码禁用 Unity Build 之后,发现仍然无效。 为什么在禁用统一构建的情况下仍然进行统一构建呢?

 

这可能是非统一构建可能存在问题。一旦提交更改并进行完全 Build(打开 VS 项目 sln 文件并重建解决方案,从项目目录中删除中间目录并重新生成 VS 项目文件),如果代码中有错误,他就会标识出实际的错误,

 

 我尝试删除 .git 文件夹,然后构建成功,运行也正常。成功后,将 .git 文件夹移回并没有导致任何构建错误,但运行不正常。这可能是 Unreal Build Tool 而不是 Git 的问题。

 

 

 我们来看一下 UE4 的 Build Configuration 描述(官方详细),以发现可用的设置和自定义编译配置:

 

 除添加到 Config/UnrealBuildTool 文件夹中已生成UE4项目外,UBT 还会从以下位置(Windows 系统)的 XML 配置文件读取设置:

 

  • Engine/Saved/UnrealBuildTool/BuildConfiguration.xml

  • User Folder/AppData/Roaming/Unreal Engine/UnrealBuildTool/BuildConfiguration.xml

  • My Documents/Unreal Engine/UnrealBuildTool/BuildConfiguration.xml

 Linux 和 Mac,则会从以下路径读取:

 

  • /Users//.config//Unreal Engine/UnrealBuildTool/BuildConfiguration.xml

  • /Users//Unreal Engine/UnrealBuildTool/BuildConfiguration.xml

 以 Windows 平台为例,我们来看一下 Engine 的 BuildConfiguration.xml 文件(路径:Engine\Saved\UnrealBuildTool\BuildConfiguration.xml),该文件为 UnrealBuildTool 读取 Build 配置的文件。

 

BuildConfiguration.xml 文件可能存在于以下几个地方:

 

  • Engine/Saved/UnrealBuildTool/BuildConfiguration.xml
  • User Folder/AppData/Roaming/Unreal Engine/UnrealBuildTool/BuildConfiguration.xml
  • My Documents/Unreal Engine/UnrealBuildTool/BuildConfiguration.xml

 内容如下:

 

<?xml version="1.0" encoding="utf-8" ?>

<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">

<BuildConfiguration>

<!-- Debug -->

<!-- <bSupportEditAndContinue>false</bSupportEditAndContinue> /\* d=false \*/ -->

<!--***<bOmitPCDebugInfoInDevelopment&gt;true&lt;/bOmitPCDebugInfoInDevelopment> /\* d=false */ -->

<!-- <bDisableDebugInfoForGeneratedCode>false</bDisableDebugInfoForGeneratedCode>--> <!-- /* d=true \*/ -->

<!-- <bAllowLTCG>false</bAllowLTCG> /\* d=false */ -->

<!-- Build -->

 <bAdaptiveUnityDisablesPCH>false</bAdaptiveUnityDisablesPCH>                        <!-- d=false -->

<ProcessorCountMultiplier>1</ProcessorCountMultiplier>                              <!-- d=1     -->

 <!--***
<MinFilesUsingPrecompiledHeaderOverride>1</MinFilesUsingPrecompiledHeaderOverride>  /* d=0
*/ -->

 <!--<bFasterWithoutUnity>true</bFasterWithoutUnity>

<!--*\*\* <bAllowRemotelyCompiledPCHs>true</bAllowRemotelyCompiledPCHs> /\* d=false \*/ -->

<!-- <bUseIncrementalLinking>true</bUseIncrementalLinking> /\* d=false */ -->

<!--**\* <bUseFastPDBLinking>true</bUseFastPDBLinking> /\* d=false */ -->

<!--*** <bAddFastPDBToProjects>true</bAddFastPDBToProjects> /\* d=false */ -->

<!-- <bUseUBTMakefiles>true</bUseUBTMakefiles> /\* d=true */ -->

<!--***<bUseUHTMakefiles>true</bUseUHTMakefiles&gt; /* d=false */ -->

<!-- <bUsePCHFiles&gt;true&lt;/bUsePCHFiles&gt; /\* d=true \*/ -->

<!-- &lt;bUseUnityBuild&gt;true&lt;/bUseUnityBuild&gt; /\* d=true */ -->

<!-- <bForceUnityBuild&gt;false&lt;/bForceUnityBuild&gt; /\* d=false */ -->

<!-- <bUseAdaptiveUnityBuild&gt;true&lt;/bUseAdaptiveUnityBuild&gt; /\* d=true \*/ -->

<!-- bForcePrecompiledHeaderForGameModules>true</bForcePrecompiledHeaderForGameModules> /* d=true \*/ -->

<!-- Debug -->

<bPrintDebugInfo>true</bPrintDebugInfo> <!-- d=false -->

<bPrintPerformanceInfo>true</bPrintPerformanceInfo> <!-- d=false -->

<bStopXGECompilationAfterErrors>true</bStopXGECompilationAfterErrors><!-- d=true -->

<!-- <bPrintToolChainTimingInfo>true</bPrintToolChainTimingInfo> --> <!-- d=false --> <!-- Passes /bt+ & /time+ -->

<!-- <bDebugBuildsActuallyUseDebugCRT>false</bDebugBuildsActuallyUseDebugCRT> /\* d=false \*/ -->

</BuildConfiguration>

<WindowsPlatform>

<!-- \*\*\*<bStrictConformanceMode>true</bStrictConformanceMode> -->

<!-- \*\*\*<StaticAnalyzer>VisualCpp</StaticAnalyzer> -->

<!-- \*\*\*<StaticAnalyzer>PVSStudio</StaticAnalyzer> -->

<!-- <Compiler>VisualStudio2017</Compiler> -->

</WindowsPlatform>

</Configuration>

 

 引擎在启动 VisualStudio 编译项目时,会触发 git status 命令。这也会导致构建受 git 状态影响,比如 git 的超时,编译时间的增加等。

 

 通过寻找官方的引擎发布说明,找到一些答案:

 

写道
Bug Fix: Optimize checks for whether the game project contains source code. Now stops as soon as the first file is found and ignores directories beginning with a ‘.’ character (eg. .git)

 

写道
Added support for adaptive non-unity builds when working from a Git repository. The ISourceFileWorkingSet interface is now used to query files belonging to the working set, and has separate implementations for Perforce (PerforceSourceFileWorkingSet) and Git (GitSourceFileWorkingSet). The Git implementation is used if a .git directory is found in the directory containing the Engine folder, the directory containing the project file, or the parent directory of the project file, and spawns a “git status” process in the background to determine which files are untracked or staged. Several new settings are supported in BuildConfiguration.xml to allow modifying default behavior: <SourceFileWorkingSet> <Provider>Default</Provider> <RepositoryPath></RepositoryPath> <GitPath>git</GitPath> </SourceFileWorkingSet>

 

 描述的第一条大概是优化了项目工程是否包含源码,一旦找到了第一个文件就停止,并忽略如 .git 一样的以 . 字符开头的目录。

 描述的第二条是说 git response 工作时,添加了对自适应非统一构建(Non-union builds)的支持,ISourceFileWorkingSet 接口现在用于查询属于工作集的文件,并且对 Perforce (PerforceSourceFileWorkingSet) 和 Git (GitSourceFileWorkingSet) 有单独的实现。如果在包含 Engine 文件夹的目录、包含项目文件的目录或项目文件的父目录中找到 .git 目录,则使用 Git 实现,并在后台生成 “git status” 进程以确定哪个文件未跟踪或暂存。 BuildConfiguration.xml 中支持几个新设置以允许修改默认行为:

 

<SourceFileWorkingSet> 
<Provider>None</Provider> 
<RepositoryPath></RepositoryPath> 
<GitPath></GitPath> 
</SourceFileWorkingSet>

 

 总结来说,如果项目目录中有 git 文件,则默认启用 git 功能,为了减少编译,该功能用于从统一构建(union builds)中排除大多数的迭代文件。可通过修改配置(新增以上 XML 设置)来禁用此行为。

 

 通过 BuildConfiguration 可以找到 BuildConfiguration.xml 文件在哪里,或者上文有介绍。完整文件如下:

 

 

<?xml version="1.0" encoding="utf-8"?>
<Configuration xmlns="https://www.unrealengine.com/BuildConfiguration">
	<SourceFileWorkingSet> 
		<Provider> None </Provider> 
		<!-- May be None, Default, Git or Perforce -->
		<RepositoryPath></RepositoryPath> 
		<GitPath></GitPath> 
	</SourceFileWorkingSet>
</Configuration>

 

 

 

 

0
0
分享到:
评论

相关推荐

    null.sys 修复Git异常

    "null.sys 修复Git异常"这个主题涉及到的是在使用Git时遇到的一种特定问题,即系统文件null.sys可能与Git的正常运行产生了冲突,导致了异常。下面我们将深入探讨这个问题,以及如何进行修复。 首先,我们需要理解...

    Windows下git拉取/推送,SVN更新/提交,maven自动编译打包,angular打包的bat脚本

    通过创建一个Maven批处理脚本,我们可以运行`mvn clean install`命令来清理项目、编译源代码、运行测试并生成最终的JAR或WAR包。如果项目依赖于特定的环境变量或配置文件,可以在脚本中设置它们,然后调用Maven。 ...

    git 中文汉化包

    为了解决这个问题,我们可以将“git 中文汉化包”应用到Git环境中,使得命令行提示、帮助文档等变为中文,提高使用体验。 在提供的描述中,“msgs”文件夹被提及,这是一个包含翻译消息的文件集合,通常用于国际化...

    UE4插件调用第三方库

    在UE4(Unreal Engine 4)开发过程中,有时我们需要集成第三方库来扩展游戏引擎的功能。...在实际开发中,可能会遇到各种问题,如编译错误、链接问题等,这时需要查阅库的文档或寻求社区支持来解决问题。

    在虚拟机上编译、安装和运行VPP

    所有编译过程中产生的文件都会保存在`build-root`目录下。 3. **安装**:完成编译后,在`build-root`目录下会出现一系列`.deb`格式的可安装文件。通过执行命令`sudo dpkg -i *.deb`进行安装。 4. **启动VPP**:使用...

    树莓派下编译seafile需要的git包源码

    在树莓派上编译Seafile,一个流行的开源云存储平台,涉及到多个步骤和技术细节。...过程中可能会遇到各种挑战,但只要按照正确的步骤和解决依赖问题,就能成功在树莓派上运行自编译的Seafile服务器。

    第1章_得到UE4并编译

    在本章中,我们将深入探讨如何获取Unreal Engine 4(简称UE4)并进行编译,以便在自己的项目中充分利用这个强大的游戏开发引擎。UE4是由Epic Games开发的,它提供了高度可视化的工作流程、实时渲染技术以及广泛的...

    《终极的 Git 课程 —— 与虚幻引擎相结合 》(4)

    学习 Git 的用法,以及如何设置虚幻引擎 UE4 和 UE5 项目与版本控制,允许您做出实验分支,提交您的更改和恢复,重置和变基,并将所有更改推到在线存储库。 通过初始化 Git LFS(大文件存储)来控制你的虚幻引擎项目中...

    MTK程序编译,MTK的编译过程,以便较快的处理编译中遇到的问题,同时为以后可能的优化编译过程提供参考。

    这一阶段通常通过运行配置脚本(如makefile或build script)来设定编译选项,例如选择目标平台、设置调试或发布模式、指定编译优化级别等。在MTK平台上,配置可能还需要考虑硬件特性,如CPU架构、内存大小等,以确保...

    静态编译的git,版本2.42.1

    但这也意味着,如果这个版本的Git有已知问题或需要更新,用户必须下载整个新版本的静态编译包,而不能仅升级部分组件。 总之,Git 2.42.1的静态编译版为x86_64平台提供了一种便捷的部署方式,无需考虑系统级别的...

    git源码压缩包v2.42.0

    Git的强大之处还在于其丰富的命令行工具,如`git clone`用于克隆远程仓库,`git add`用于暂存更改,`git commit`用于提交更改,`git push`用于将本地更改推送到远程仓库,以及`git pull`用于从远程仓库拉取最新的...

    解决git _ 无法将“git”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确.md

    解决git _ 无法将“git”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确

    《终极的 Git 课程 —— 与虚幻引擎相结合 》(3)

    学习 Git 的用法,以及如何设置虚幻引擎 UE4 和 UE5 项目与版本控制,允许您做出实验分支,提交您的更改和恢复,重置和变基,并将所有更改推到在线存储库。 通过初始化 Git LFS(大文件存储)来控制你的虚幻引擎项目中...

    ndk-build.zip

    这个文件的核心是“ndk-build.exe”,这是一个用于编译原生C/C++代码的命令行工具,与Git Bash环境集成,使得用户可以在Git Bash shell中调用它来执行原生Android开发的相关构建任务。 在Android开发中,NDK...

    ue4-gitignore:虚幻引擎4项目的带有git-lfs的git设置示例

    这个模板会包含一系列UE4特有的文件和目录,如`Binaries`、`DerivedDataCache`、`Intermediate`、`Saved`等,这些都是在开发过程中产生的临时或自动生成的文件,不需要纳入版本控制。 为了启用Git LFS,你需要在...

    opencv 编译

    这个错误通常意味着编译过程中找不到特定的源文件或头文件,这可能是由于多种原因导致的,如配置问题、路径不正确、缺失依赖或版本不兼容等。 首先,我们来详细了解一下OpenCV的编译步骤: 1. **获取源代码**:你...

    git-2.37.1.tar.gz

    这个压缩包包含了编译和安装Git所需的所有文件,通过解压和编译,用户可以在自己的Linux系统上构建并安装最新版的Git。 在Linux上安装Git分为几个步骤: 1. **下载和解压**:首先,你需要下载`git-2.37.1.tar.gz` ...

    webpack构建完成后自动推送到指定分支仅支持gitssh方式进行连接

    4. **运行构建**:执行 Webpack 构建命令,如 `npm run build` 或 `yarn build`。当构建完成并成功时,插件会自动执行 Git 命令,将更新推送到指定的 Git 分支。 5. **错误处理**:确保你的构建脚本包含适当的错误...

    git-2.19.2.zip

    Git是世界上最流行的分布式版本控制系统,广泛应用于软件开发和项目协作中。Git-2.19.2是Git的特定版本,此版本包含了自2.19.1以来的一系列更新和改进,旨在优化性能,增强功能,并修复已知的问题。在本篇中,我们将...

Global site tag (gtag.js) - Google Analytics