红联Linux门户
Linux帮助

从linux中svn diff失效来谈.svn/text-base目录下.svn-base文件

发布时间:2016-10-22 09:19:35来源:blog.csdn.net/stpeace作者:stpeace
先说说事情的来龙去脉吧!
 
由于需要,我们要批量改动某目录下的打印log的接口,简单来说,要把某目录下的所有文件中的api_log_A改为api_log_B .某同学有过做类似事情的经验,并且成功了,于是直接把命令给我, happy啊。
于是乎,我执行了一下这个命令,实现了批量替换,我确认,确实替换成功了,但是,准备提交前,我用svn diff比较了一下,居然没有任何差异,我纳闷了。为什么那位同学那样替换可以,但我那样替换不行?
于是,我重新恢复环境,用手动改了一下某个文件(test.cpp), 用svn diff的时候,发现是有差异的。 这就纳闷了,为什么用命令批量修改就不行了呢?
 
我们以test.cpp文件为例, 发现如下测试事实:
1.从零开始,手动改test.cpp中的api_log_A为api_log_B, 用svn diff比较有差异
2.从零开始,用命令批量改动test.cpp中的api_log_A为api_log_B, 用svn diff比较, 没有差异。
3.对比1和2中改动后的test.cpp, 发现完全一致。
 
没辙了,当时确实没有想到办法,于是请教某哥,于是展开思考,svn diff到底在干什么?原理是什么?继续定位发现,原来,svn diff 是将.svn/text-base/test.cpp.svn-base文件和test.cpp进行比较,而我们用命令执行的时候,改变了test.cpp,也同时改变了test.cpp.svn-base,于是,用svn diff的时候就么有任何差异了。
原来如此!
 
现在,问题清楚了:
1. 为什么手动改动test.cpp,svn diff有差异呢?因为:.svn/text-base/test.cpp.svn-base没变,而test.cpp变化了。
2. 为什么用命令改动test.cpp中的api_log_A为api_log_B,用svn diff比较没有差异呢?因为.svn/text-base/test.cpp.svn-base和test.cpp同时变化了。
3. 为什么在别的同学那里没有出问题,但在我这里出问题呢?因为,别的同学那里,grep api_log_A -rl ./ 命令没有递归,不会涉及到.svn/text-base/test.cpp.svn-base文件的修改,但在我的Linux上却有了递归,访问并随后修改了.svn/text-base/test.cpp.svn-base文件,于是svn diff就体现出差异了。
grep -rl 就是个坑啊!
 
解决办法:
grep的时候,仅仅针对.h和.cpp/.c
当然啦,如果目录很深(不止一层),而grep -rl又不支持递归的话,那还是用find命令查找吧(支持递归)。
遇到这个问题,也算是奇葩了,结论不重要,分析问题的过程才重要!
 
本文永久更新地址:http://www.linuxdiyf.com/linux/25266.html