本文档仍在编写中,内容可能随时变更,可能与任何已发布的 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 $