Svn Diff

最近碰到了svn merge之后,再使用svn diff产生出来的patch中缺少某些文件的信息。后来发现了原因。使用svn st查看那些文件信息,类似于:

1
2
3
A       src/aa.c
A + src/bb.c
M src/cc.c

这样输出的patch中,aa.c是信息是都有的。cc.c也是有的。但是bb.c的信息不存在。主要是存在那个+. +的意思是这些文件存在于提交历史中,所以该文件不能再次被diff.但是为什么会存在于提交历史中,这个我就不知道了。
下面是教你如何去掉+.
使用下面的脚本会方便的去掉各个文件的+,对于目录的+是不能去掉的.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh
plus_file=`svn st | grep "^A" | grep "+" | cut -d" " -f6`
for i in $plus_file; do
if [ -d $i ]; then
echo "skip $i"
else
cp ${i} ${i}.back;
echo $i;
svn revert $i;
mv ${i}.back ${i};
svn add $i;
fi

done;
1
2
3
4
5
上面脚本的工作原理是:
cp src/bb.c src/bb.c.back
svn revert src/bb.c
mv src/bb.c.back src/bb.c
svn add src/bb.c

这样所有的A +状态就变为了A。这样再使用svn diff就可以得到完整的diff信息。如果有想法还可以处理一下文件夹。不过review code时,文件夹的意义并不大,所以就没有处理。这里顺便感谢下巧大牛。