本文档仍在编写中,内容可能随时变更,可能与任何已发布的 Apache™ Subversion® 软件版本不符。将此页面添加为书签或推荐给其他人可能不是一个明智的选择。请访问 https://svnbook.subversion.org.cn/ 获取本书的稳定版本。

名称

svn patch - 将 unidiff 补丁中表示的更改应用于工作副本。

语法

svn patch PATCHFILE [WCPATH]

描述

此子命令将将 unidiff 格式的补丁文件 PATCHFILE 中描述的更改应用于工作副本 WCPATH。与大多数其他工作副本子命令一样,如果省略了 WCPATH,则更改将应用于当前工作目录。可以使用 svn diff 命令或第三方差异工具生成适合应用于工作副本的 unidiff 补丁。补丁文件中发现的任何非 unidiff 内容将被忽略。

补丁文件中列出的更改将被应用或拒绝。如果更改与其确切的行偏移量不匹配,则如果在补丁提供的周围行上下文中找到了匹配项,则该更改可能会在文件中的较早或较晚位置应用。更改还可以应用 模糊- 意味着,在尝试匹配更改位置时,忽略了一行或多行上下文。如果找不到更改的匹配上下文,则该更改会发生冲突,并将写入扩展名为 .svnpatch.rej 的拒绝文件中。

svn patch 使用字母代码报告已修补文件或目录的状态行,与 svn update 提供通知的方式非常相似。字母代码具有以下含义

A

添加

D

删除

C

冲突

G

合并

U

更新

使用偏移量或模糊应用的更改将在以 '>' 符号开头的行上报告。您应该仔细审查此类更改。

如果补丁从文件中删除所有内容,则该文件将自动安排删除。同样,如果补丁创建了新文件,则该文件将自动安排添加。使用 svn revert 撤消不需要的删除和添加。

选项

示例

应用由 svn diff 命令生成的简单补丁文件。我们的补丁文件将创建一个新文件,删除另一个文件,并修改第三个文件的内容和属性。以下是补丁文件本身(我们假设它被创造性地命名为 PATCH

Index: deleted-file
===================================================================
--- deleted-file	(revision 3)
+++ deleted-file	(working copy)
@@ -1 +0,0 @@
-This file will be deleted.
Index: changed-file
===================================================================
--- changed-file	(revision 4)
+++ changed-file	(working copy)
@@ -1,6 +1,6 @@
 The letters in a line of text
 Could make your day much better.
 But expanded into paragraphs,
-I'd tell of kangaroos and calves
+I'd tell of monkeys and giraffes
 Until you were all smiles and laughs
 From my letter made of letters.

Property changes on: changed-file
___________________________________________________________________
Added: propname
## -0,0 +1 ##
+propvalue
Index: added-file
===================================================================
--- added-file	(revision 0)
+++ added-file	(working copy)
@@ -0,0 +1 @@
+This is an added file.

我们可以使用 svn patch 将之前的补丁文件应用于我们存储库中的另一个工作副本,并使用 svn diff 验证它是否做对了

$ cd /some/other/workingcopy
$ svn patch /path/to/PATCH
D         deleted-file
UU        changed-file
A         added-file
$ svn diff
Index: deleted-file
===================================================================
--- deleted-file	(revision 3)
+++ deleted-file	(working copy)
@@ -1 +0,0 @@
-This file will be deleted.
Index: changed-file
===================================================================
--- changed-file	(revision 4)
+++ changed-file	(working copy)
@@ -1,6 +1,6 @@
 The letters in a line of text
 Could make your day much better.
 But expanded into paragraphs,
-I'd tell of kangaroos and calves
+I'd tell of monkeys and giraffes
 Until you were all smiles and laughs
 From my letter made of letters.

Property changes on: changed-file
___________________________________________________________________
Added: propname
## -0,0 +1 ##
+propvalue
Index: added-file
===================================================================
--- added-file	(revision 0)
+++ added-file	(working copy)
@@ -0,0 +1 @@
+This is an added file.
$

有时您可能需要 Subversion 解释一个补丁 反向 - 其中添加的内容被视为删除的内容,反之亦然。为此目的,请使用 --reverse-diff 选项。在下面的示例中,我们将保存一个描述工作副本中更改的补丁文件,然后使用反向补丁操作撤消这些更改。

$ svn status
M       foo.c
$ svn diff > PATCH
$ cat PATCH
Index: foo.c
===================================================================
--- foo.c	(revision 128)
+++ foo.c	(working copy)
@@ -1003,7 +1003,7 @@
     return ERROR_ON_THE_G_STRING;
 
   /* Do something in a loop. */
-  for (i = 0; i < txns->nelts; i++)
+  for (i = 0; i < txns->nelts; i--)
     {
       status = do_something(i);
       if (status)
$ svn patch --reverse-diff PATCH
U         foo.c
$ svn status
$
TortoiseSVN 官方中文版 1.14.7 发布