本手册旨在描述 Apache™ Subversion® 的 1.7.x 系列。如果您运行的是其他版本的 Subversion,强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的手册。

名称

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 发布