本手册旨在描述 Apache™ Subversion® 的 1.7.x 系列。如果您运行的是其他版本的 Subversion,强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的手册。
svn patch — 将 unidiff 补丁中表示的更改应用到工作副本。
此子命令将把 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 $