![将单个补丁应用于多个目录中的文件](https://linux22.com/image/6117/%E5%B0%86%E5%8D%95%E4%B8%AA%E8%A1%A5%E4%B8%81%E5%BA%94%E7%94%A8%E4%BA%8E%E5%A4%9A%E4%B8%AA%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6.png)
目录结构如下所示:
orig/l1/l2/file2patch
orig/l1-2/file2patch
与
new/l1/l2/file2patch
new/l1-2/file2patch
我得到了这些文件之间的正确差异并将其保存在一个文件中,但事实证明应用它并不简单。
我已经尝试过patch -d orig/ < patch.diff
,但-d
期望要修补的文件应立即存在于orig
有什么方法可以让补丁在目录上重复出现并将补丁应用到补丁中存在的指定文件吗?
答案1
虽然给定的路径名看起来不太正确(尤其是new
树,其他人已经更改了),但您可以记住,可以告诉程序从使用该选项patch
的输出中忽略给定数量的目录级别。diff
-p
当将补丁应用于与补丁文件显示的目录不同的目录中的文件时,您将cd
进入该目录(以取消不匹配的一部分)并使用该-p
选项来调整cd
.
这是一个简短的脚本,说明了我如何解决这个问题(使用 GNU 补丁的试运行选项来进行简单的列表):
#!/bin/sh
cd /tmp/foo
OUT=/tmp/patch.diff
rm -f $OUT
diff -u orig/l1/l2/file2patch new/l1/l2/file2patch >>$OUT
diff -u orig/l1-2/file2patch new/l1-2/file2patch >>$OUT
diffstat -p1 $OUT
cd orig
patch -p1 --dry-run <$OUT
输入:
$ find . -type f
./new/l1/l2/file2patch
./new/l1-2/file2patch
./orig/l1/l2/file2patch
./orig/l1-2/file2patch
输出:
$ /tmp/xx
l1-2/file2patch | 19 +++++++++++++------
l1/l2/file2patch | 5 ++---
2 files changed, 15 insertions(+), 9 deletions(-)
/tmp/foo/orig
patching file l1/l2/file2patch
patching file l1-2/file2patch
进一步阅读:
diff
-比较两个文件(POSIX)patch
-将更改应用到文件(POSIX)diffstat
-从差异输出制作直方图