diff & patch
参考自:
http://yuxu9710108.blog.163.com/blog/static/237515342011102533126906/
http://blog.csdn.net/fmddlmyy/article/details/2140064
比较文件的diff命令格式是:
diff -u old_file new_file
参数 "-u" 指定diff命令使用unified格式,这是一种最常用的格式
关于diff的unified格式:
以"---"开头的行是旧文件信息,以"+++"开头的行是新文件信息:
--- old/drv1.h 2014-09-21 09:56:04.330394246 +0800
+++ new/drv1.h 2014-09-21 09:56:21.630394045 +0800
@@ -4,9 +4,8 @@
#include "def1.h"
typedef struct {
- int p1;
- int p2;
- int p3;
+ int a;
+ int b;
}App1;
void do_app1(void);
unified格式默认在变化部分的前后各显示三行上下文。在上例中,旧文件的7、8、9行被替换成新文件的7、8行。旧文件的变化部分是7-9行,前后多显示3行,因此显示4-12行。新文件的变化部分是7-8行,前后多显示3行,因此实现4-11行。以"@@"包围的行指示补丁的范围。
@@ -4,9 +4,8 @@
'-4,9'中,'-'表示旧文件,'4,9'表示从第4行开始,显示9行,即显示4-12行。'+4,8'中,'+'表示新文件,'4,8'表示从第4行开始,显示8行,即显示'4-11'行。'@@'行之后是上下文和变化的文本,其中'-'开头的行是旧文件特有的,'+'开头的行是新文件特有的,其它行是两个文件都有的,即补丁的上下文。
应用补丁
补丁发布后,需要应用补丁:
patch -p1 < ../drv1.diff
参数"-pn"中的n表示要从补丁文件的文件路径中去掉几层目录。例如:p1表示去掉一层目录,"old/drv1.h"去掉一层就成为"drv1.h"。patch命令在当前目录下找到"drv1.h"后应用补丁。
我们通常都在代码树的上一层目录制作补丁,在代码树的根目录应用补丁。因此,最常用的patch命令格式是:
patch -p1 < 补丁文件
如果需要比较的目录,那么:
diff -Nur old_dir/ new_dir/ > prj.diff
比较目录的常用命令是:
diff -Nur old_dir/ new_dir/ > file.patch
或者
diff -Naur old_dir/ new_dir/
参数"-N"将不存在的文件当作空文件。如果没有这个参数,补丁就不会包含孤儿文件(即另一方没有的文件)。
参数"-r"表示比较子目录。
参数"-a"表示将所有文件当作文本文件。
有时候,新目录里只放了修改过的文件。这时可以不使用-N参数以忽略孤儿文件,即"diff -ur old_dir new_dir"。diff会输出孤儿文件的提示,我们可以删除或保留这些提示,它们对patch没有影响。
如果想把加上的patch的文件还原:
patch -R file_has_patched.file < file.patch
一个大项目可能由不同开发者提供很多补丁,这些补丁可能还存在依赖关系,例如补丁B必须打在补丁A上。由于补丁之间存在了依赖关系,因此不便于使用patch工具管理,
此时需要一个工具quilt。
2014/12/13
比较不同目录下的文件
diff --brief -r mix_common/ mixcommon-0.1.8
浙公网安备 33010602011771号