Git 合并 patch 时的冲突处理一例

git version 1.6.0.4

几个新手刚刚开始接触 Git,为了维护核心仓库的“纯洁”,避免太多无关信息被误提交进仓库(再次批评一些图形化工具默认的“Select All”),采用了核心仓库只读,邮件提交 patch,审核后再提交的工作流程。

期间有时会遇到合并冲突,正常的原因一般是未及时下载新版本产生了冲突,特殊一点的原因是手工修改 patch 内容导致的。有时候看注释写得不够准确,忍不住就改了,有时候是 Geany 保存时自动去除了 patch 原文中的行尾空格,有时候是文件回车格式、BOM 等变动了,总之合并 patch 的时候,如果生成 patch 的“原稿”找不到,一般就产生了冲突,比如:

$ git am 0001-BUG-Sybase.patch
Applying: CHG: 读取Sybase如果时间为空,设置默认时间的修改
error: patch failed: source.php:38
error: source.php: patch does not apply
Patch failed at 0001.
When you have resolved this problem run "git am --resolved".
If you would prefer to skip this patch, instead run "git am --skip".
To restore the original branch and stop patching run "git am --abort".

刚开始一看有些懵,因为没有任何冲突在哪里的提示,后来找到一种方法,am 操作出问题后先手工 apply:

$ git apply --reject 0001-BUG-Sybase.patch
Checking patch source.php...
error: while searching for:
        // 注释
        // 以下为几行代码片断
error: patch failed: source.php:38
Applying patch source.php with 1 rejects...
Rejected hunk #1.

这样,就把没有冲突的文件先合并了,剩下有冲突的作了标记。先看输出,error: while searching for: 说明是这段代码有冲突,error: patch failed: source.php:38 指明了产生冲突的代码片断的开始行号,相应的,patch 中应该有这么一段:

diff --git a/source.php b/source.php
index 8770441..4e77b8a 100644
--- a/source.php
+++ b/source.php
@@ -38,27 +38,23 @@ class Site extends Module
        // 注释
        // 以下为几行代码片断

同时,还会产生一个 source.php.rej 文件,里面也是上面这段因为冲突无法合并的代码片断。

现在,在这段代码中查找冲突原因,并对文件进行修改,source.php.rej 参考完了可以删掉。改好之后,用 git add 把 source.php 添加到缓冲区,同时也要把其他没有冲突合并成功了的文件也加进来,因为在作 apply 操作的时候他们也发生了变化:

$ git add source.php
$ git add 其他 apply 进来的文件们

最后:

$ git am --resolved
Applying: CHG: 读取Sybase如果时间为空,设置默认时间的修改

大功告成。

中间如果处理乱了,用 git reset 恢复即可,所以合并 patch 在一个“干净”的分支上处理更好。

[ubuntu]安装vmware时找不到c header files的小问题

很多人都是用xp作主系统,然后用vmware虚拟一个linux学习,我现在的做法却恰恰相反,我用ubuntu作主系统,然后虚拟一个xp用于工作 :)。

vmware下载和安装就不说了,安装完成之后,运行vmware-config.pl的时候,会有一步是询问内核的头文件在哪里:

What is the location of the directory of C header files that match your running kernel? [/usr/src/linux/include]

由于ubuntu 6.06 dapper的内核版本是,2.6.15,所以就没法找到,网上说这是vmware自己的问题,到http://ftp.cvut.cz/vmware/下载一个vmware-any-any-updatexxx.tar.gz装上,然后再次运行vmware-config.pl就能够找到正确的地址了:

What is the location of the directory of C header files that match your running kernel? [/lib/modules/2.6.15-22-386/build/include]

参考1参考2(这里还有关于安装鼠标的讨论),参考3

可怜我一开始没有安装linux-headers,而是傻傻的下载安装了一个linux-source-2.6,70多M,下载了1个多小时啊。。。 (注意安装的headers版本要和当前运行的一样,386和686版本要分清)

🙂

vmware 5.5.1 19175 linux 版的注册码: J3E6J-V6G4M-Y84DY-4YXQQ GC4K9-FMC0A-1A0FV-4YEX2

附上一张截图,哈哈。

在linux下运行vmware的截图

update @ 20060510: 我安装使用的xp是一个什么秋无痕告别2004什么的版本,里面有4种安装方式,自动/手动安装免激活版、自动/手动安装零售版,一开始选择两个手动安装的版本,一到同意完协议,“正在安装设备”的时候,就停住了,剩余37分钟,再也不前进了,后来偶然选了一个自动安装零售版的,居然就没事了。

update @ 2007-02-12

ubuntu升级到edgy之后,vmware又罢工了(另外一台机就没事),提示vmmon编译什么的错误,就像这样,解决方法为:到/usr/lib/vmware/modules/source下,新建一个脚本:

for foo in vmmon vmnet; do 
    tar xf $foo.tar
    perl -pi -e 's,-Werror,-DKBUILD_BASENAME=\\"\$\(DRIVER\)\\" \\\n\t-Werror,g' ${foo}-only/Makefile.kernel
    mv ${foo}.tar ${foo}.tar.vm
    tar cf ${foo}.tar ${foo}-only
done

赋予执行权限,执行,然后再vmware-config.pl就可以了。 参考一参考二(我手工改就不行,用脚本就可以了,怎么回事捏?)。

Update @ 2007-04-24

升级到feisty之后,内核升级到了2.6.20-15,vmware又找不到c header了,到这里再下载一个any-any补丁,运行后就可以了。

Update @ 2007-11-03

升级到ubuntu 7.10 Gutsy之后,也是需要安装这个补丁,补丁也升级了:http://knihovny.cvut.cz/ftp/pub/vmware/vmware-any-any-update113.tar.gz,参见Installing VMware Products on Unsupported Linux Distributions

Update @ 2008-06-23

升级到Ubuntu 8.04 Hardy之后,安装补丁http://blog.creonfx.com/temp/vmware-any-any-update-116.tgz,参见How-to Install VMware Player / Workstation on 2.6.24 Kernel,不过配置正常后运行出现错误:

/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_3.4' not found (required by /usr/lib/libcairo.so.2)
/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libpng12.so.0/libpng12.so.0: no version information available (required by /usr/lib/libcairo.so.2)
/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_4.2.0' not found (required by /usr/lib/libstdc++.so.6)

按照回复中的内容更改了几个so文件之后,错误更离谱了,无从下手,只好重新安装了个VMware Player 2.0.3.80004 For Linux,config时依然需要应用上面哪个any-any补丁,然后就能跑起来了。

后来安装VMware Workstation 6.5 Build 91182 Beta for Linux就顺利多了,一下就成功了,从官网上可以申请到30天试用的序列号。

vmware功能丰富但每次升级内核以后配置都很麻烦,virtualbox升级方便些但少一点功能,真的是很难选择呢。

参考