# 版本控制集成

> Integrate Unity with version control systems.

Unity 能够与两种版本控制系统集成：[Perforce](/engine/6000.0/manual/unity-editor/editor-features/version-control/per-force-integration.md) 和 [Plastic SCM](/engine/6000.0/manual/plastic-scmplugin.md)。要在 Unity 中进行[版本控制](https://unity.com/products/plastic-scm/source-code-management#what-version-control)集成，必须为 Unity 项目设置 **Perforce** 或 **Plastic SCM** 服务器。

## 在 Unity 中设置版本控制

打开一个 Unity 项目，选择**编辑 (Edit)** > **项目设置 (Project Settings)**，然后选择**版本控制 (Version Control)** 类别。

| **属性**                               |                        | **描述**                                                                                                                                                                                                                                                          |
| ------------------------------------ | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Mode**                             |                        | 选择版本控制模式。                                                                                                                                                                                                                                                       |
|                                      | **Hidden meta files**  | 在操作系统的文件资源管理器中隐藏 .meta 文件。无论您选择哪种模式，Unity 都不会在项目视图中显示 .meta 文件。                                                                                                                                                                                                 |
|                                      | **Visible meta files** | 选择此选项可以使用 Unity 不支持的版本控制系统。这是默认设置。您可以使用您选择的版本控制系统来管理资源的源文件和元数据。                                                                                                                                                                                                 |
|                                      | **Perforce**           | 如果使用 [Perforce](https://www.perforce.com/) 作为版本控制系统，请选择此选项。                                                                                                                                                                                                     |
| **Username**                         |                        | 输入与您的 Perforce 帐户关联的用户名。此属性仅在 **Mode** 设置为 **Perforce** 时可见。                                                                                                                                                                                                    |
| **密码**                               |                        | 输入与您的 Perforce 帐户关联的密码。此属性仅在 **Mode** 设置为 **Perforce** 时可见。                                                                                                                                                                                                     |
| **Workspace**                        |                        | 输入您的工作空间名称。例如，`Example**Workspace**1`。此属性仅在 **Mode** 设置为 **Perforce** 时可见。                                                                                                                                                                                      |
| **Server**                           |                        | 输入 Unity 项目所在的服务器地址。例如，localhost：1666。此属性仅在 **Mode** 设置为 **Perforce** 时可见。                                                                                                                                                                                      |
| **Host**                             |                        | 输入您希望计算机模拟的主机名。例如，workstation123.perforce.com.此属性仅在 **Mode** 设置为 **Perforce** 时可见。                                                                                                                                                                              |
| **Log Level**                        |                        | 选择要在 Unity 的控制台日志中接收的版本控制信息量。                                                                                                                                                                                                                                   |
|                                      | **Verbose**            | 记录所有与版本控制相关的操作。此选项提供非常详细的日志，适用于调试版本控制设置。此属性仅在 **Mode** 设置为 **Perforce** 时可见。                                                                                                                                                                                    |
|                                      | **Info**               | 记录与版本控制相关的错误、警告和信息。                                                                                                                                                                                                                                             |
|                                      | **Notice**             | 仅记录错误和警告。                                                                                                                                                                                                                                                       |
|                                      | **Fatal**              | Unity 仅将致命错误打印到控制台。                                                                                                                                                                                                                                             |
| **状态**                               |                        | 显示与版本控制系统连接的状态信息。如果未连接，请选择 **Connect** 以连接到已配置的系统。此属性仅在 **Mode** 设置为 **Perforce** 时可见。                                                                                                                                                                          |
| **Automatic Add**                    |                        | 启用此设置后，当您通过编辑器或磁盘文件夹将文件添加到项目时，Unity 会自动将文件添加到版本控制系统。禁用此设置后，您需要手动将文件添加到版本控制系统。默认情况下会启用此设置。此属性仅在 **Mode** 设置为 **Perforce** 时可见。                                                                                                                                   |
| **Work Offline**                     |                        | 启用此设置后，您可以在离线模式下工作。启用此设置后，您需要在 P4V 中协调离线工作，或使用 P4 中的 reconcile 命令，以使 Perforce 服务器与您在离线时所做的更改保持同步。有关更多信息，请参阅[脱机使用 Perforce](/engine/6000.0/manual/unity-editor/editor-features/version-control/per-force-integration.md.md)。此属性仅在 **Mode** 设置为 **Perforce** 时可见。 |
| **Async Update**                     |                        | 启用此设置可使用异步版本控制状态查询。启用后，Perforce 将更新文件的版本控制状态，并且不会阻塞 Unity 编辑器。当与版本控制服务器的连接存在高延迟时，建议启用此设置。\*\*注意：\*\*只有状态查询是异步的。更改文件状态或需要最新文件状态的操作仍然是同步执行的。此属性仅在 **Mode** 设置为 **Perforce** 时可见。                                                                                  |
| **Show Failed Checkouts**            |                        | 启用此设置后，当 Perforce 无法执行签出操作时，将显示对话框。这可能发生在连接中断，或另一个用户已独占签出您要编辑的资源时。此属性仅在 **Mode** 设置为 **Perforce** 时可见。                                                                                                                                                          |
| **Overwrite Failed Checkout Assets** |                        | 启用此设置后，Unity 将强制保存无法签出的资源。这意味着即使 Perforce 无法签出文件，Unity 也会强制保存文件。默认情况下会启用此选项。如果禁用此设置，则当 Perforce 无法签出文件时，Unity 不会强制保存文件。此属性仅在 **Mode** 设置为 **Perforce** 时可见。                                                                                                     |
| **Smart Merge**                      |                        | [Smart Merge](/engine/6000.0/manual/unity-editor/editor-features/version-control/smart-merge.md.md) 可帮助 Unity 合并在同一行上有更改的文件。如果多个用户同时在同一个项目上工作，此功能非常有用。此属性仅在 **Mode** 设置为 **Perforce** 时可见。                                                                      |
|                                      | **Off**                | 禁用 Smart Merge。                                                                                                                                                                                                                                                 |
|                                      | **Ask**                | 启用 Smart Merge，但在发生冲突时会在合并前提示用户。这是默认设置。                                                                                                                                                                                                                         |
|                                      | **Premerge**           | 自动使用 Smart Merge。                                                                                                                                                                                                                                               |
| **Version Packages Outside Project** |                        | 跟踪位于 Unity 项目根文件夹之外的磁盘上的包的更改，同时这些包仍在本地工作空间中。此属性仅在 **Mode** 设置为 **Perforce** 时可见。                                                                                                                                                                                |
| **Overlay Icons**                    |                        | 启用此设置可在 Editor 中显示版本控制状态图标。此属性仅在 **Mode** 设置为 **Perforce** 时可见。                                                                                                                                                                                                 |

配置\_\_版本控制 (Version Control)\_\_ 设置，然后选择状态区域旁边的\_\_连接 (Connect)\_\_ 按钮以连接到版本控制系统。Unity 连接到系统后，状态区域将显示\_\_已连接 (Connected)\_\_。

要调整版本控制工具，请打开\_\_偏好设置 (Preferences)**，然后选择\_\_外部工具 (External Tools)** 部分。可以在\_\_版本控制差异/合并 (Revision Control Diff/Merge)\_\_ 下面选择一个新工具。

## 在 Unity 中使用版本控制

在将 Editor 设置为与版本控制系统一起使用时，您可以通过 Editor 执行版本控制操作，而不必在版本控制客户端中执行这些操作。为此，请右键单击项目 (Project) 视图中的资源。

版本控制操作根据您使用的版本控制方式而异。下表显示了每种版本控制方式可以使用的操作：

| **版本控制操作**                     | **描述**                                                    | **Perforce** | **Plastic SCM**                                                                                                                  |
| ------------------------------ | --------------------------------------------------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------- |
| **获取最新 (Get Latest)**          | 这将更新计算机上的文件以使这些文件与版本控制系统中的文件匹配。                           | 是            | 否。要获取最新更改并更新文件，需要使用[版本控制窗口](#window)（**窗口 (Window) > 资源管理 (Asset Management) > 版本控制 (Version Control)**）。                        |
| **提交 (Submit)**                | 将文件的当前状态提交到版本控制系统。                                        | 是            | 是                                                                                                                                |
| **签出 (Check Out)**             | 允许对文件进行更改。                                                | 是            | 是                                                                                                                                |
| **Check Out (Other)**          | 选择是要签出资源及其 .meta 文件，仅签出资源，还是仅签出 .meta 文件。                 | 是            | 否                                                                                                                                |
| **标记添加 (Mark Add)**            | 将文件添加到版本控制中。                                              | 是            | 是                                                                                                                                |
| **还原 (Revert)**                | 放弃对打开的已更改文件所做的更改。                                         | 是            | 是                                                                                                                                |
| **还原未更改内容 (Revert Unchanged)** | 从先前已签出但尚未修改的文件中删除“已签出”状态。                                 | 是            | 是                                                                                                                                |
| **解决冲突 (Resolve Conflicts)**   | 解决已被多个用户更改的文件的冲突。                                         | 是            | 否。冲突出现在版本控制菜单中，但是您需要在 Plastic SCM GUI 中解决冲突。                                                                                     |
| **锁定 (Lock)**                  | 阻止其他用户提交对文件的更改。                                           | 是            | 否。要在 Plastic SCM 中锁定或解锁文件，必须在外部编辑特定的 Plastic SCM 锁定文件。有关更多信息，请参阅 [Plastic SCM 集成](/engine/6000.0/manual/plastic-scmplugin.md)页面。 |
| **解锁 (Unlock)**                | 解锁，并允许任何人提交更改。                                            | 是            | 否。要在 Plastic SCM 中锁定或解锁文件，必须在外部编辑特定的 Plastic SCM 锁定文件。有关更多信息，请参阅 [Plastic SCM 集成](/engine/6000.0/manual/plastic-scmplugin.md)页面。 |
| **Diff**                       | 比较计算机上的本地文件和服务器上的文件之间的差异。您可以选择仅比较资源文件，或比较资源文件及其 .meta 文件。 | 是            | 是                                                                                                                                |

### 签出文件

在某些版本控制系统（例如 Perforce）中，默认情况下，版本控制文件为只读，并且要求您在编辑文件之前先将它们签出（除非启用了\_\_脱机工作 (Work offline) **设置）。从 Editor 中处理版本化的资源时，检视面板 (Inspector) 将显示用于启用文件编辑的\_\_签出 (Check Out)** 按钮。此外，项目设置 (Project Settings) 检视面板还具有 **Checkout** 按钮，可用于签出特定的项目设置。

如果您的自定义 Editor 脚本代码禁用了只读资源的另一个自定义编辑工具的某些部分，或者如果您要手动写入版本化文件，请使用 [AssetDatabase.IsOpenForEdit](/engine/6000.0/script-reference/unity-editor/asset-database/is-open-for-edit.md) 和 [AssetDatabase.MakeEditable](/engine/6000.0/script-reference/unity-editor/asset-database/make-editable.md) API 检查文件是否可编辑，并执行签出操作。

版本控制集成还公开了 [Provider.PreCheckoutCallback](/engine/6000.0/script-reference/unity-editor-version-control/provider/pre-checkout-callback.md) 和 [Provider.PreSubmitCallback](/engine/6000.0/script-reference/unity-editor-version-control/provider/pre-submit-callback.md) C# 回调，用于自定义版本控制操作验证逻辑。

Unity 执行\_\_保存项目 (Save Project)\_\_ 操作时，会将您在 Editor 中修改或标记为已修改的所有资源写入磁盘中。然后会根据需要在版本控制中签出资源。即使没有对文件进行实际更改，这也可能导致资源被签出。如果 Editor 脚本在资源上调用 [EditorUtility.SetDirty](/engine/6000.0/script-reference/unity-editor/editor-utility/set-dirty.md) 但不检查资源是否已修改，通常会发生这种情况。

\*\*注意：\*\*如果 Unity 无法将更改提交到版本控制客户端（例如，如果服务器关闭或发生许可证问题），它会将更改存储于单独的变更集中。

在您保存了对 .scene 文件的更改后，Unity 会自动将该文件签出。如果使用 Plastic SCM，则还会自动签出自动生成的资源，例如光照贴图。

## 版本控制窗口

可以使用版本控制窗口来查看位于变更列表中的文件。要访问该窗口，请导航到\_\_窗口 (Window) > 资源管理 (Asset Management) > 版本控制 (Version Control)\_\_。

**传出 (Outgoing)** 选项卡列出了所有等待提交到版本控制中的本地更改。**传入 (Incoming)** 选项卡列出了需要从版本控制中拉取的所有更改。

在窗口中右键单击资源或变更列表可对它们执行操作。要在变更列表之间移动资源，只需将资源从一个变更列表拖动到目标变更列表的标题上。

### 图标

Editor 会显示以下图标来指示文件和资源的版本控制状态：

| **Icon**                                                                                                  | **目的**                                                              |
| --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
| &#xA;**Frame:**&#xA;![](/api/media?file=/engine/6000.0/media/images/VersionControl_P4_AddedLocal.png)     | 本地添加的文件，等待添加到版本控制中。                                                 |
| &#xA;**Frame:**&#xA;![](/api/media?file=/engine/6000.0/media/images/VersionControl_P4_AddedRemote.png)    | 由另一个用户添加到版本控制中的文件，等待添加到版本控制中。                                       |
| &#xA;**Frame:**&#xA;![](/api/media?file=/engine/6000.0/media/images/VersionControl_P4_CheckOutLocal.png)  | 文件已在本地签出。                                                           |
| &#xA;**Frame:**&#xA;![](/api/media?file=/engine/6000.0/media/images/VersionControl_P4_CheckOutRemote.png) | 文件已被另一个用户远程签出。                                                      |
| &#xA;**Frame:**&#xA;![](/api/media?file=/engine/6000.0/media/images/VersionControl_P4_Conflicted.png)     | 合并此文件时存在冲突并且需要解决。                                                   |
| &#xA;**Frame:**&#xA;![](/api/media?file=/engine/6000.0/media/images/VersionControl_P4_DeletedLocal.png)   | 文件已在本地删除，在版本控制中等待删除。                                                |
| &#xA;**Frame:**&#xA;![](/api/media?file=/engine/6000.0/media/images/VersionControl_P4_DeletedRemote.png)  | 文件已被另一个用户删除，在版本控制中等待删除。                                             |
| &#xA;**Frame:**&#xA;![](/api/media?file=/engine/6000.0/media/images/VersionControl_P4_Local.png)          | 文件尚未受版本控制可以使用\_\_标记添加 (Mark Add)\_\_ 操作来手动添加文件。                     |
| &#xA;**Frame:**&#xA;![](/api/media?file=/engine/6000.0/media/images/VersionControl_P4_LockedLocal.png)    | 文件已被您锁定，其他用户无法对其进行修改。                                               |
| &#xA;**Frame:**&#xA;![](/api/media?file=/engine/6000.0/media/images/VersionControl_P4_LockedRemote.png)   | 文件已被另一个用户锁定，您无法对其进行修改。                                              |
| &#xA;**Frame:**&#xA;![](/api/media?file=/engine/6000.0/media/images/VersionControl_P4_OutOfSync.png)      | 另一个用户已签入此文件的新版本使用\_\_应用传入更改 (Apply Incoming Changes)\_\_ 操作可获取最新版本。 |
| &#xA;**Frame:**&#xA;![](/api/media?file=/engine/6000.0/media/images/VersionControl_P4_AsyncUpdate.png)    | 服务器正在请求此文件的版本控制状态，或正在等待响应。仅当使用集中式版本控制系统（如 Perforce）时才会显示。           |
