// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= 在 NetBeans IDE 中使用 Subversion 支持
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: 在 NetBeans IDE 中使用 Subversion 支持 - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, 在 NetBeans IDE 中使用 Subversion 支持

NetBeans IDE 可与 Subversion 客户端版本 1.6.x 及更高版本紧密集成。该 IDE 的 Subversion 支持旨在帮助使用共享资源库工作的团队简化开发过程，允许您在 IDE 内直接从项目系统中执行版本控制任务。

本文档通过指导您完成使用版本控制软件的标准工作流，介绍了如何在 IDE 中执行基本的版本控制任务。

请注意，与 Cygwin 一起使用时，NetBeans Subversion 支持_不_起作用。

link:http://subversion.tigris.org/[+Subversion+] 是一种常用的开源版本控制系统，它将取代 CVS 成为下一代工具。该系统提供了各种改进功能，例如：

* 提供已重命名、移动或删除文件的完整版本历史记录。
* 实现原子提交操作，即修改集合全部进入资源库或部分进入资源库（如果连接中断）。
* 提供项目元数据的版本控制。


*要学完本教程，您需要具备以下软件和资源。*

|===
|软件或资源 |要求的版本 

|link:https://netbeans.org/downloads/index.html[+NetBeans IDE+] |版本 6.9、7.0、7.1、7.2、7.3、7.4 或 8.0 

|link:http://java.sun.com/javase/downloads/index.jsp[+Java 开发工具包 (JDK)+] |版本 6、7 或 8 

|link:http://www.open.collab.net/downloads/netbeans/[+Subversion 客户端软件+] |1.6.x 或更高版本 
|===

*Windows 用户注意事项：*您可以将捆绑的 Subversion 客户端作为 NetBeans IDE 插件来安装。转至“工具”>“插件”，打开“可用插件”标签，然后安装捆绑的用于 Windows 的 Subversion 客户端。


== 设置 Subversion

利用 IDE 的 Subversion 支持前，您需要在计算机上安装 Subversion 客户端软件。IDE 的 Subversion 支持是通过与 Subversion 客户端进行交互以执行版本控制命令来实现的。根据您使用的系统，以及是否将 Subversion 客户端安装到非默认位置，您可能还需要在 IDE 中注册 Subversion 可执行文件的路径。最后，您需要确保拥有要连接的 Subversion 资源库。

* <<getting,获取软件>>
* <<specifying,指定 Subversion 可执行文件的路径>>
* <<ensuring,确保拥有要连接的资源库>>


=== 获取软件

确保在计算机上安装了以下软件：

* NetBeans IDE（link:https://netbeans.org/downloads/index.html[+下载+]）
* Java SE Development Kit（link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+下载+]）
* Subversion 客户端软件（link:http://www.open.collab.net/downloads/netbeans/[+下载+]）


=== 指定 Subversion 可执行文件的路径

NetBeans IDE 会尝试使用计算机中的 `$PATH` 系统变量自动标识 Subversion 可执行文件的位置。不过，根据您使用的平台或者是否将 Subversion 客户端安装到了不同位置，可能需要明确指定可执行文件的路径。

默认情况下，Subversion 可执行文件安装在 `/usr/bin` 或 `/usr/local/bin/` 文件夹中（如果是 UNIX 和 OS X 计算机），或安装在 `C:\Program Files\Subversion\bin\` 或 `C:\Program Files\CollabNet Subversion\bin\` 中（如果是 Windows 计算机）。

在基于 *nix 的计算机上，可以在终端窗口中键入 `which svn`，以验证 Subversion 可执行文件的位置。在 Windows 计算机上，可以在整个系统范围内搜索 `svn.exe`。

在 IDE 中设置 Subversion 可执行文件的路径：

1. 从主菜单中选择 "Tools"（工具）> "Options"（选项）；在 OS X 上为 "NetBeans" > "Preferences"（首选项）。"Options"（选项）对话框打开。
2. 选择对话框顶部的 "Miscellaneous"（其他）图标，然后单击 "Versioning"（版本控制）标签。在 "Versioning Systems"（版本控制系统）下的左窗格中，选择 "Subversion"。对话框主窗口中将会显示 Subversion 的用户定义选项：

 [.feature]
--
image::images/svn-options-small.png[role="left", link="images/svn-options.png"]
--


. 在 "Specify the SVN Home Folder"（指定 SVN 主文件夹）文本字段中，键入可执行文件的路径，或单击 "Browse"（浏览）在系统中找到它。请注意，您不需要将 Subversion 可执行文件_包含_在路径中。
. 单击 "OK"（确定），然后重新启动 IDE，使更改生效。


=== 确保拥有要连接的资源库

从 IDE 中调用 Subversion 操作前，确保您可以访问 Subversion 资源库。IDE _不_支持创建 Subversion 资源库，因为这不是常用的操作（在生产环境中，只有在确定了资源库布局的设计后，才创建一次资源库）。此外，它还需要使用管理命令。

如果要使用本地资源库对 IDE 的支持进行试验，则可以使用 link:http://svnbook.red-bean.com/en/1.1/ch09s02.html[+svnadmin 工具+]创建一个资源库，该工具包含在 Subversion 客户端软件中。

要在计算机上创建 Subversion 资源库，请使用 `svnadmin create`。在命令提示符下，键入以下内容：


[source,java]
----

svnadmin create /path/to/your/repository
----

有关详细信息，请参见 link:http://svnbook.red-bean.com/en/1.1/ch05s02.html[+http://svnbook.red-bean.com/en/1.1/ch05s02.html+]。




== 将本地文件与资源库保持同步

使用版本控制系统时，可以这样操作：将本地文件与资源库保持同步，再对本地副本进行更改，然后将其提交到该资源库。下表介绍了在 NetBeans IDE 中同步项目所能使用的各种方法，这取决于您的具体情况：

* <<opening,在 IDE 中打开 Subversion 项目>>
* <<checking,从资源库中检出文件>>
* <<importing,将文件导入资源库中>>


=== 在 IDE 中打开 Subversion 项目

如果您已拥有 Subversion 版本控制项目，并且已在 IDE 之外使用该项目，则可以在 IDE 中将其打开，版本控制功能将自动变为可用。IDE 将扫描打开的项目，如果其中包含 `.svn` 目录，则文件状态和上下文相关支持将针对 Subversion 版本控制项目自动激活。


=== 从资源库中检出文件

如果要通过 IDE 与远程资源库相连，请检出并立即开始使用文件，具体操作如下：

1. 在 NetBeans IDE 内，从主菜单中选择 "Team"（团队开发）> "Subversion" > "Checkout"（检出）。检出向导打开。

NOTE: IDE 的下拉菜单是与上下文相关的，即可用选项取决于当前选定的项。因此，如果您已在使用 Subversion 项目，则可以从主菜单中选择 "Versioning"（版本控制）> "Checkout"（检出）。


. 在向导的第一个面板中输入 URL，其中包含要连接到的资源库的连接协议和位置。

IDE 支持以下协议类型： 

|===
|协议 |访问方法 |示例 

|*文件* |直接访问资源库（在本地磁盘上） |`file:///repository_path` 

|*http* |通过 WebDAV 协议访问支持 Subversion 的服务器 |`http://hostname/repository_path` 

|*https* |通过使用 SSL 加密的 HTTP 协议进行访问 |`https://hostname/repository_path` 

|*svn* |通过定制协议访问 `svnserve` 服务器 |`svn://hostname/repository_path` 

|*svn+ssh* |通过 SVN 协议以及外部 SSH 隧道进行访问 |`svn+ssh://hostname/repository_path` 
|===

根据所使用的协议，可能需要输入其他信息，如用户名和口令（例如如果选择 `http://`、`https://` 或 `svn://`）；如果选择 `svn+ssh://`，则必须提供命令以建立外部隧道。

NOTE: 如果尝试使用 `https` 实现认证的身份验证，请参见link:http://wiki.netbeans.org/wiki/view/FaqSslUserCert[+如何通过用户认证的身份验证连接到 Subversion 资源库？+] 

如需 `svn+ssh` 的更多帮助，请参见link:http://wiki.netbeans.org/wiki/view/FaqSubversionSSH[+如何设置 SSH 以使用 Subversion？+]


. 如果要使用代理，请务必单击 "Proxy Configuration"（代理配置）按钮，然后输入所需的信息。如果确定资源库的连接设置正确无误，请单击 "Next"（下一步）。
. 在向导的 "Folders to Checkout"（要检出的文件夹）面板中，在 "Repository Folder"（资源库文件夹）字段中指定要检出的文件夹。如果要检出的文件夹名未知，请单击 "Browse"（浏览）按钮，以查看资源库中当前保留的所有文件夹。在显示的 "Browse Repository Folders"（浏览资源库文件夹）对话框中，选择任何已列出的文件夹，然后单击 "OK"（确定）。然后会将选定文件夹添加到 "Repository Folder(s)"（资源库文件夹）字段（在以下屏幕快照中输入了 "MyProject"）：

[.feature]
--
image::images/checkout-small.png[role="left", link="images/checkout.png"]
--


. 在 "Repository Revision"（资源库修订）字段中输入修订版本号，否则保留为空，表示您要检出文件夹 _HEAD_ 或最新修订版本。
. 在 "Local Folder"（本地文件夹）字段中，输入计算机上文件要检出到的位置。将 "Scan for NetBeans Projects after Checkout"（在检出后扫描 Netbeans 项目）选项保持选中状态，然后单击 "Finish"（完成），以启动检出操作。IDE 将检出选定的源，并且 IDE 的状态栏会显示将文件从资源库下载到本地工作目录的进度。您还可以在 "Output"（输出）窗口（在 Windows 上按 Ctrl-4 组合键；在 OS X 上按 Cmd-4 组合键）中查看正要检出的文件。

NOTE: 如果已检出的源中包含 NetBeans 项目，则将显示一个对话框，提示您在 IDE 中将其打开。如果源中不包含项目，也将显示该对话框，提示您创建基于这些源的新项目，然后在 IDE 中将其打开。如果为这类源创建新项目，请选择相应的项目类别（即在新建项目向导中选择），然后使用该类别中的 "With Existing Sources"（基于现有源）选项。


=== 将文件导入资源库中

此外，也可以将已在 IDE 中处理的项目导入远程资源库中，然后对该项目执行同步操作，再在 IDE 中继续进行处理。

NOTE: 事实上，从系统中_导出_文件时，可在版本控制系统中使用术语 "import" 表明文件正_导入_资源库中。

将项目导入资源库中：

1. 在 "Projects"（项目）窗口（在 Windows 上按 Ctrl-1 组合键；在 OS X 上按 Cmd-1 组合键）中，选择未进行版本控制的项目，然后从节点的右键单击菜单中选择 "Versioning"（版本控制）> "Import into Subversion Repository"（导入到 Subversion 资源库）。Subversion 的导入向导打开。
2. 在导入向导的 "Subversion Repository"（Subversion 资源库）面板中，指定 Subversion URL 所定义的 Subversion 资源库的<<protocolTypes,协议>>和位置。根据您所选的内容，可能需要指定其他设置（如资源库用户名和口令）；如果选择 `svn+ssh://`，则必须指定隧道命令以建立外部隧道。有关更多的详细信息，请参见 link:http://wiki.netbeans.org/wiki/view/NetBeansUserFAQ#section-NetBeansUserFAQ-VersionControlSystems[+Subversion 用户常见问题解答+]。单击 "Next"（下一步）。
3. 在 "Repository Folder"（资源库文件夹）面板中，指定要放置项目的资源库文件夹。默认情况下，系统建议在 "Repository Folder"（资源库文件夹）文本字段中键入采用您的项目名称的文件夹。
4. 在 "Specify the Message"（指定消息）下方的文本区域中，输入要导入到资源库中的项目的描述。
5. 单击 "Finish"（完成）启动导入操作，或者单击 "Next"（下一步），继续转至第三个面板，以预览准备导入的所有文件。在此面板中，您可以选择将个别文件从导入中排除（如下所示），也可以在导入之前标识文件的 MIME 类型。

[.feature]
--
image::images/import-small.png[role="left", link="images/import.png"]
--

在单击 "Finish"（完成）后，IDE 会将项目文件上载到资源库中，并打开 "Output"（输出）窗口以显示进度。




== 编辑源

在 IDE 中打开一个 Subversion 版本控制项目后，就可以开始对源进行更改了。与 NetBeans IDE 中打开的任何项目一样，在 IDE 窗口（例如“项目”（在 Windows 上按 Ctrl-1 组合键；在 OS X 上按 Cmd-1 组合键）、“文件”（在 Windows 上按 Ctrl-2 组合键；在 OS X 上按 Cmd-2 组合键）或“收藏夹”（在 Windows 上按 Ctrl-3 组合键；在 OS X 上按 Cmd-3 组合键））中显示文件时，您可以双击文件节点，在源代码编辑器中打开文件。

在 IDE 中的处理源时，您需要处理各种 UI 组件，这有助于查看和操作版本控制命令：

* <<viewingChanges,在源代码编辑器中查看更改>>
* <<viewingFileStatus,查看文件状态信息>>
* <<comparing,比较文件版本>>
* <<merging,合并文件修订版本>>


=== 在源代码编辑器中查看更改

如果在 IDE 的源代码编辑器中打开版本控制文件，则对照资源库中以前检出的基本版本对文件进行修改时，可以查看对该文件进行的实时更改。您在操作时，IDE 通过源代码编辑器旁注中的颜色编码传递了以下信息：

|===
|*蓝色* (     ) |表示自早期修订版本以来更改的行。 

|*绿色* (     ) |表示自早期修订版本以来添加的行。 

|*红色* (     ) |表示自早期修订版本以来删除的行。 
|===

源代码编辑器左旁注逐行显示发生的更改。当修改给定行时，所做更改会立即在左旁注中显示出来。

您可以单击旁注中的颜色组以调用版本控制命令。例如，单击红色图标（指明从本地副本中删除了行）时，左下方的屏幕快照会显示可用的窗口部件。

源代码编辑器右旁注提供了对文件所做的更改的整体视图，从上到下显示。更改文件之后，将会立即生成颜色编码。

注：单击旁注的特定点可以让内联光标立即转到文件中的该位置。想要查看受影响行的行号，可以将鼠标放在右旁注中的彩色图标上：

|===
|[.feature]
--
image::images/left-ui-small.png[role="left", link="images/left-ui.png"]
--
 
*左旁注* |image:images/right-ui.png[title="显示在编辑器右旁注中的版本控制颜色编码"] 
*右旁注* 
|===


=== 查看文件状态信息

在使用 "Projects"（项目）（在 Windows 上按 Ctrl-1 组合键；在 OS X 上按 Cmd-1 组合键）、"Files"（文件）（在 Windows 上按 Ctrl-2 组合键；在 OS X 上按 Cmd-2 组合键）或 "Favorites"（收藏夹）（在 Windows 上按 Ctrl-3 组合键；在 OS X 上按 Cmd-3 组合键）或 "Versioning"（版本控制）窗口时，IDE 将提供一些可视化功能以帮助查看文件状态信息。在下面的示例中，请注意标记（例如，image:images/blue-badge.png[]）、文件名颜色和相邻状态标签如何全都彼此一致，以向您提供一种简单而有效的方法来跟踪文件的版本控制信息：

image::images/badge-example.png[]

标记、颜色编码、文件状态标签和最重要的 "Versioning"（版本控制）窗口都有助于在 IDE 中有效地查看和管理版本控制信息。

* <<badges,标记和颜色编码>>
* <<fileStatus,文件状态标签>>
* <<versioning,"Versioning"（版本控制）窗口>>


==== 标记和颜色编码

标记应用于项目、文件夹、包节点，通知您包含在该节点中的文件状态：

下表显示了用于标记的颜色方案：

|===
|UI 组件 |描述 

|*蓝色标记* (image:images/blue-badge.png[]) |指示存在已在本地修改、添加或删除的文件。对于包，此标记仅应用于包本身，而不应用于它的子包。对于项目或文件夹，此标记指示其中的更改，或指示其所包含子文件夹中的任何更改。 

|*红色标记* (image:images/red-badge.png[]) |标记包含_冲突_文件（即与资源库中保留的版本冲突的本地版本）的项目、文件夹或包。对于包，此标记仅应用于包本身，而不应用于它的子包。对于项目或文件夹，此标记指示其中的冲突，或指示其所包含子文件夹中的任何冲突。 
|===


颜色编码应用于文件名，以指示它们相对于资源库的当前状态：

|===
|颜色 |示例 |描述 

|*蓝色* |image:images/blue-text.png[] |表示在本地修改了文件。 

|*绿色* |image:images/green-text.png[] |表示在本地添加了文件。 

|*红色* |image:images/red-text.png[] |表示文件中包含本地工作副本与资源库中版本之间的冲突。 

|*灰色* |image:images/gray-text.png[] |表示文件被 Subversion 忽略，并且不包含在版本控制命令（如 "Update"（更新）和 "Commit"（提交））中。如果文件没有进行版本化，那么它们只能被忽略。 

|*删除线* |image:images/strike-through-text.png[] |表示从提交操作中排除了文件。只有选择从提交操作中排除个别文件时，删除线文本才出现在特定位置，例如 "Versioning"（版本控制）窗口或 "Commit"（提交）对话框。这类文件还受其他 Subversion 命令（如 "Update"（更新））的影响。 
|===


==== 文件状态标签

文件状态标签以文本的形式指示 IDE 窗口中的版本控制文件的状态。默认情况下，IDE 在窗口中列出的文件右侧以灰色文本显示状态（新的、已修改或已忽略等）和文件夹信息。然而，您可以根据需要修改此格式。例如，如果要将修订版本号添加到状态标签中，请执行以下操作：

1. 从主菜单中选择 "Tools"（工具）> "Options"（选项）；在 OS X 上为 "NetBeans" > "Preferences"（首选项）。此时将打开 "Options"（选项）窗口。
2. 选择窗口顶部的 "Miscellaneous"（其他）图标，然后单击下面的 "Versioning"（版本控制）标签。确保在左面板中的版本控制系统下选择了 "Subversion"。（请参考上面的<<svnOptions,屏幕快照>>）。
3. 单击 "Status Label Format"（状态标签格式）文本字段右侧的 "Add Variable"（添加变量）按钮。在显示的 "Add Variable"（添加变量）对话框中，选择 `{revision}` 变量，然后单击 "OK"（确定）。此时修订版本变量将添加到 "Status Label Format"（状态标签格式）文本字段中。
4. 要重新设置状态标签的格式，以在文件右侧仅显示状态和修订版本，可按下列顺序重新排列 "Status Label Format"（状态标签格式）文本字段的内容：

[source,java]
----

[{status}; {revision}]
----
单击 "OK"（确定）。状态标签现在列出了文件状态和修订版本号（如果适用）： 

从主菜单中选择 "View"（视图）> "Show Versioning Labels"（显示版本控制标签），可打开和关闭文件状态标签。


image::images/file-labels.png[]

从主菜单中选择 "View"（视图）> "Show Versioning Labels"（显示版本控制标签），可打开和关闭文件状态标签。


==== "Versioning"（版本控制）窗口

Subversion 的 "Versioning"（版本控制）窗口为您提供了一个实时列表，其中包括对本地工作副本的选定文件夹中的文件做出的所有更改。默认情况下，它将在 IDE 的底部面板中打开，其中列出了已添加、删除或修改的文件。

要打开 "Versioning"（版本控制）窗口，请选择一个版本控制文件或文件夹（例如，从 "Projects"（项目）、"Files"（文件）或 "Favorites"（收藏夹）窗口中选择），然后从右键单击菜单中选择 "Subversion" > "Show Changes"（显示更改），或者从主菜单中选择 "Team"（团队开发）> "Show Changes"（显示更改）。下面的窗口出现在 IDE 底部：

[.feature]
--
image::images/versioning-window-small.png[role="left", link="images/versioning-window.png"]
--

默认情况下，"Versioning"（版本控制）窗口会显示选定包或文件夹中所有已修改文件的列表。使用工具栏中的按钮，可以选择显示所有更改，也可以将显示的文件列表限定为本地或远程修改的文件。此外，也可以单击列出的文件上面的列标题，按名称、状态或位置对这些文件进行排序。

NOTE: 

* 要收到关于某个已打开项目中源文件的修改时间的通知，请从主菜单中选择 "Team"（团队开发）> "Show Changes"（显示更改）。此外，如果 "Versioning"（版本控制）窗口已打开，请单击 "Refresh Status"（刷新状态）按钮。
* "Projects"（项目）窗口中的操作仅适用于项目本身，不是递归的。要显示嵌套/子项目中的修改，可以使用 "Files"（文件）或 "Favorites"（收藏夹）窗口。

"Versioning"（版本控制）窗口工具栏中还包含一些按钮，可以为列表中显示的所有文件调用最常用的 Subversion 任务。下表列出了 "Versioning"（版本控制）窗口工具栏中提供的 Subversion 命令：

|===
|图标 |名称 |功能 

|image:images/refresh.png[] |*刷新状态* |刷新选定文件和文件夹的状态。可以刷新 "Versioning"（版本控制）窗口中显示的文件，以反映可能已在外部执行的任何更改。 

|image:images/diff.png[] |*全部比较* |打开比较查看器，您可以用它对本地副本和资源库中保留的版本进行并排比较。 

|image:images/update.png[] |*全部更新* |更新资源库中的所有选定文件。 

|image:images/commit.png[] |*全部提交* |用于将本地更改提交到资源库。 
|===

您可以在 "Versioning"（版本控制）窗口中访问其他 Subversion 命令，方法是选择与修改的文件相对应的表行，然后单击鼠标右键，从获得的菜单中选择一个命令：

image::images/versioning-right-click.png[]

例如，您可以在文件上执行以下操作：

|===
|* *显示标注*： 

在源代码编辑器中打开的文件的左旁注中显示作者和修订版本号信息。
 |image:images/annotations.png[] 

|* *搜索历史记录*： 

用于在 IDE 的历史记录查看器中搜索并比较选定文件的多个修订版本。通过历史记录查看器，还可以执行<<comparing,比较>>，或将本地副本回退至选定修订版本。
 |[.feature]
--
image::images/history-viewer-small.png[role="left", link="images/history-viewer.png"]
--
 

|* *从提交中排除*： 

用于标记执行提交时要排除的文件。
 |[.feature]
--
image::images/exclude-from-commit-small.png[role="left", link="images/exclude-from-commit.png"]
--
 

|* *还原删除*： 

打开 "Revert Modifications"（还原修改）对话框，您可以通过它还原已提交到本地工作副本中的文件的所有删除操作。此时将从 IDE 的本地历史记录档案中检索指定文件，并将其恢复到本地工作副本中。
 |[.feature]
--
image::images/revert-mods-small.png[role="left", link="images/revert-mods.png"]
--
 

|* *还原修改*： 

打开 "Revert Modifications"（还原修改）对话框，您可以使用它来指定参数，以便将所有本地更改还原到资源库中保留的修订版本。

指定修订版本时，可以单击 "Search"（搜索），以打开 "Search Revisions"（搜索修订）对话框。此时将扫描资源库，并根据您输入的日期列出所有文件修订版本。
 |[.feature]
--
image::images/search-rev-small.png[role="left", link="images/search-rev.png"]
--
 
|===


=== 比较文件版本

使用版本控制项目时，比较文件修订版本是一项常见任务。IDE 允许您使用 "Diff"（比较）命令比较修订版本，该命令可以从选定项的右键单击菜单（"Subversion" > "Diff"（比较））获得，也可以从 "Versioning"（版本控制）窗口获得。在 "Versioning"（版本控制）窗口中，可通过双击列出的文件来执行比较；否则，可单击顶部工具栏中的 "Diff All"（全部比较）图标 (image:images/diff.png[])。

进行比较时，将在 IDE 的主窗口中打开选定文件和修订版本的图形化比较查看器。比较查看器在两个并行面板中显示两个副本。较新的副本显示在右侧，因此，如果要将资源库修订版本与工作副本进行比较，则在右面板中显示工作副本：

[.feature]
--
image::images/diff-viewer-small.png[role="left", link="images/diff-viewer.png"]
--

比较查看器使用<<viewingChanges,颜色编码>>来显示版本控制更改，该颜色编码与其他地方使用的颜色编码相同。在上面显示的屏幕快照中，绿色块指示已添加到较新修订版本中的内容。红色块指示从较新修订版本中删除了以前的修订内容。蓝色指示在突出显示的行中发的更改。

此外，当对一组文件（例如，项目、包或文件夹）执行比较时，或者当单击 "Diff All"（全部比较）(image:images/diff.png[]) 时，可在各比较之间进行切换，只需单击比较查看器上方区域中列出的文件即可。

比较查看器还为您提供了以下功能：

* <<makeChanges,对本地工作副本进行更改>>
* <<navigateDifferences,在差异之间导航>>
* <<changeViewCriteria,更改查看条件>>


==== 对本地工作副本进行更改

如果要对本地工作副本进行比较，IDE 允许您从比较查看器中直接进行更改。为此，可以将光标放在比较查看器的右侧窗格中，并且相应地修改文件，也可以每个突出显示的更改旁边的内联图标：

|===
|*Replace*（替换）(image:images/insert.png[])： |将突出显示的文本从上一修订版本插入当前修订版本中 

|*Move All*（全部移动）(image:images/arrow.png[])： |将文件的当前修订版本还原到上一个选定修订版本的状态 

|*Remove*（删除）(image:images/remove.png[])： |从当前版本中删除突出显示的文本，使之与先前版本完全匹配。 
|===


==== 在比较文件之间的差异中导航

如果您的比较中包含多个差异，则可以使用工具栏中的箭头图标在它们之间导航。箭头图标可用于查看从上到下列出的差异：

|===
|*Previous*（上一个）(image:images/diff-prev.png[])： |转至比较中显示的上一个差异 

|*Next*（下一个）(image:images/diff-next.png[])： |转至比较中显示的下一个差异 
|===


==== 更改查看条件

您可以选择是查看包含本地工作副本或资源库中更改的文件，还是查看同时包含两者中的更改的文件：

|===
|*Local*（本地）(image:images/locally-mod.png[])： |仅显示本地修改的文件 

|*Remote*（远程）(image:images/remotely-mod.png[])： |仅显示远程修改的文件 

|*Both*（两者）(image:images/both-mod.png[])： |同时显示本地和远程修改的文件 
|===

NOTE: <<badges,标记和颜色编码>>部分中描述的颜色方案不适用于上面提到的图标。


=== 合并文件修订版本

通过 NetBeans IDE，可将资源库修订版本之间的更改与本地工作副本合并。您可以指定一组要合并的修订版本。甚至还可以合并两个不同资源库文件夹中的一组修订版本。

以下方案描述了一个常见的用例：检出文件夹 `JavaApp` 中的主干版本后，现在要将副本与分支合并。出于演示目的，资源库布局中的 `branches` 文件夹用于包含所有分支文件：

1. 在 "Projects"（项目）、"Files"（文件）或 "Favorites"（收藏夹）窗口中，右键单击要执行合并操作的文件或文件夹，然后选择 "Subversion" > "Merge Changes"（合并更改）。此时将显示 "Merge"（合并）对话框。
2. 从 "Merge From"（合并）下拉列表中，选择 "One Repository Folder Since Its Origin"（一个资源库文件夹，自创建时的版本开始合并）。此时将移动自单个分支创建以来对其所做的全部更改。
3. 在 "Repository Folder"（资源库文件夹）文本字段中，输入要从其中移动更改的文件夹路径 (`branches/JavaApp`)。将 "Ending Revision"（结束修订号）字段保留为空，以指示您要将所有修订版本添加至 _HEAD_（即当前状态）中。

[.feature]
--
image::images/svn-merge-small.png[role="left", link="images/svn-merge.png"]
--


. 单击 "Merge"（合并）。IDE 会将分支修订版本与本地文件副本之间发现的所有差异进行合并。如果发生合并冲突，则文件的状态会更新为 <<resolving,Merge Conflict>>（合并冲突），以说明这一情况。

NOTE: 将修订版本合并到本地工作副本后，仍须使用 "Commit"（提交）命令提交更改，以便将它们添加到资源库中。




== 将源文件提交到资源库

对源进行更改后，可以将其提交到资源库。通常，最好对照资源库更新现有的所有副本，然后再执行提交，以便确保不会出现冲突。然而，当多名开发者同时处理项目时，可能会发生冲突，这应该属于正常现象。IDE 提供了灵活的支持，让您可以执行所有这些功能。此外，还提供了冲突解决程序，用于安全地处理发生的任何冲突。

* <<updating,更新本地副本>>
* <<resolving,解决冲突>>
* <<performing,执行提交>>


=== 更新本地副本

在 "Projects"（项目）、"Files"（文件）或 "Favorites"（收藏夹）窗口中，可以从任何版本控制项的右键单击菜单中选择 "Subversion" > "Update"（更新），以执行更新。直接在 "Versioning"（版本控制）窗口中工作时，只需右键单击列出的文件并选择 "Update"（更新）即可。

要对所有源文件执行更新，可以单击 "Update All"（全部更新）图标 (image:images/update.png[])，该图标显示在位于<<versioning,“版本控制”窗口>>和<<comparing,比较查看器>>顶部的工具栏中。资源库中可能进行的任何更改显示在 "Versioning Output"（版本控制输出）窗口中。


=== 解决冲突

执行更新或提交时，IDE 的 Subversion 支持会将文件与资源库源进行比较，以确保相同位置尚未进行其他更改。如果上次检出（或更新）不再匹配资源库 _HEAD_（即最新修订版本），_并且_应用于本地工作副本的更改与 HEAD 中也已更改的区域保持一致，则更新或提交会导致_冲突_。

如<<badges,标记和颜色编码>>中所示，当在 "Projects"（项目）、"Files"（文件）或 "Favorites"（收藏夹）窗口中进行查看时，冲突会在 IDE 中显示为红色文本，并附带有一个红色标记 (image:images/red-badge.png[])。在 "Versioning"（版本控制）窗口中工作时，冲突还可通过文件的状态表示：

image::images/conflict-versioning-win.png[]

出现的任何冲突必须在文件提交到资源库之前得到解决。您可以在 IDE 中使用合并冲突解决程序解决冲突。合并冲突解决程序提供了一个直观的界面，让您可以在按顺序解决各个冲突的同时，边查看合并的冲突边进行更改。您可以访问发生冲突的文件中的合并冲突解决程序，方法是右键单击该文件，然后选择 "Subversion" > "Resolve Conflicts"（解决冲突）。

"Merge Conflicts Resolver"（合并冲突解决程序）在顶部窗格中并排显示两个冲突的修订版本，并突出显示冲突区域。对两个修订版本之间的各个冲突进行合并时，下方窗格会描述显示的文件：

[.feature]
--
image::images/conflict-resolver-small.png[role="left", link="images/conflict-resolver.png"]
--

您可以通过接受顶部窗格中显示的两个修订版本之一来解决冲突。单击要接受的修订版本的 "Accept"（接受）按钮。IDE 会将接受的修订版本与源文件合并，您可以立即在合并冲突解决程序的底部窗格中看到合并结果。解决了所有冲突后，单击 "OK"（确定）退出合并冲突解决程序并保存修改的文件。此时将删除冲突标记，现在您就可以将修改的文件提交到资源库了。


=== 执行提交

编辑源文件、执行更新并解决所有冲突后，您可以将文件从本地工作副本提交到资源库。IDE 允许通过以下方式调用提交命令：

* 在 "Projects"（项目）、"Files"（文件）或 "Favorites"（收藏夹）窗口中，右键单击新项或修改项，然后选择 "Subversion" > "Commit"（提交）。
* 从 "Versioning"（版本控制）窗口或比较查看器中，单击位于工具栏中的 "Commit All"（全部提交）(image:images/commit.png[]) 按钮。

此时将打开 "Commit"（提交）对话框，其中显示要提交到资源库的文件：

[.feature]
--
image::images/commit-dialog-small.png[role="left", link="images/commit-dialog.png"]
--

"Commit"（提交）对话框将列出以下内容：

* 本地修改的所有文件
* 本地删除的所有文件
* 所有新文件（即，尚未包含在资源库中的文件）
* 已重命名的所有文件。Subversion 可通过删除原始文件并使用新名称创建副本来处理重命名的文件。

在 "Commit"（提交）对话框中，可以指定是否从提交中排除个别文件。为此，可以单击选定文件的 "Commit Action"（提交操作）列，并从下拉列表中选择 "Exclude from Commit"（从提交中排除）。同样，添加了新文件后，可以从下拉列表中选择 "Add as Binary"（作为二进制内容添加）或 "Add as Text"（作为文本添加），以指定 MIME 类型。

执行提交：

1. 在 "Commit Message"（提交消息）文本区域中键入提交消息。或者，单击右上角的 "Recent Messages"（近期的消息）(image:images/recent-msgs.png[]) 图标，以便在以前使用过的消息列表中进行查看和选择。
2. 指定各个文件的操作后，单击 "Commit"（提交）。IDE 将执行提交操作，并将本地更改发送到资源库中。在执行提交操作时，将在界面右下方显示 IDE 的状态栏。成功提交后，版本控制标记会在 "Projects"（项目）、"Files"（文件）或 "Favorites"（收藏夹）窗口中消失，并且提交文件中的颜色编码会变回黑色。




== 小结

NetBeans IDE 6.x 及更高版本的 Subversion 指导教程就到此结束了。本文档通过指导您在使用 IDE 的 Subversion 支持时完成标准的工作流，介绍了如何在 IDE 中执行基本的版本控制任务。它还介绍了如何设置版本控制项目和对版本控制文件执行基本任务，同时简要说明了 IDE 中包含的一些新的 Subversion 功能。

link:/about/contact_form.html?to=3&subject=Feedback:%20Using%20Subversion%20Support%20in%20NetBeans%20IDE[+发送有关此教程的反馈意见+]





== 另请参见

有关相关文档，请参见以下参考资料：

* link:http://wiki.netbeans.org/wiki/view/NetBeansUserFAQ#section-NetBeansUserFAQ-VersionControlSystems[+NetBeans IDE 的 Subversion 支持常见问题解答+]
* link:http://wiki.netbeans.org/FaqSubversionClients[+Subversion 客户端常见问题解答+]
* link:git.html[+在 NetBeans IDE 中使用 Git 支持+]
* link:mercurial.html[+在 NetBeans IDE 中使用 Mercurial 支持+]
* link:mercurial-queues.html[+在 NetBeans IDE 中使用 Mercurial 队列支持+]
* link:cvs.html[+在 NetBeans IDE 中使用 CVS 支持+]
* link:clearcase.html[+在 NetBeans IDE 中使用 ClearCase 支持+]
* _使用 NetBeans IDE 开发应用程序_中的link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG234[+使用版本控制对应用程序进行版本控制+]。



