结论不重要, 思路才重要------从linux中svn diff失效来谈谈.svn/text-base目录下的.svn-base文件

       先说说事情的来龙去脉吧!

       由于需要, 我们要批量改动某目录下的打印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命令查找吧(支持递归)。


       遇到这个问题, 也算是奇葩了, 结论不重要, 分析问题的过程才重要, 赞某哥!





你可能感兴趣的:(s2:,软件进阶,s2:,Linux杂项)