2014年8月29日 星期五

patch的幾種方法

有幾種常見做diff和patch的方法

1. 使用大家最愛的git

matthew@E6430:~/temp$ git log
commit 406400903bc059bedfee59b11d60f7375818a21b
Author: Matthew.Shyu
Date:   Fri Aug 29 19:59:47 2014 +0800

    add hello world

commit 619ff93b9c08a2c63d433bd67de2f4051046332f
Author: Matthew.Shyu
Date:   Fri Aug 29 19:59:09 2014 +0800

    initial commit


例如要為"add hello world"這個commit做一個patch file的時候
可以使用如下的命令
$ git format-patch 406400903bc059bedfee59b11d60f7375818a21b -1
-1 代表往前一個commit的意思

要apply patch的時候就可以
$ git apply 0001-add-hello-world.patch

或者
$ git am 0001-add-hello-world.patch

這兩個的差別在於
第一個命令只是將patch的內容加上去並不會進行commit
所以在workspace上只是以unstaging change的形式存在
第二個命令就直接將patch進行commit到log裡

2. 使用quilt
quilt是一個patch管理程式
在Debian/Ubuntu上可以使用
$ apt-get install quilt
來安裝

我們首先在source code的根目錄產生一個patches目錄
$ mkdir patches
然後新增一個patch
$ quilt new hello-world.patch
再來是將需要修改的file加到quilt中
有兩個作法
$ quilt add test.c
或直接
$ quilt edit test.c
第二個作法是將test.c加到quilt中
並使用預設的編輯器對test.c進行編輯
當改好後
$ quilt refresh
就可以檢查patches/裡的patch是否正確
如果不再修改了
則使用
$ quilt pop
這時候被修改的文件會恢復成原狀
如果要再度修改
$ quilt push hello-world.patch

3. 古老的diff/patch法
使用
$ diff -purN <orig> <new> > hello-world.patch
$ patch -p0 < hello-world.patch
p0代表不rip directory
p1代表去除一層directory
依此類推


沒有留言:

張貼留言