您的位置:首页 > 运维架构 > Shell

【SHELL】一个非常有趣的问题

2016-06-02 10:23 615 查看

使用SHELL解决的一个问题

现在需要代码合并,从SVN上合并到GIT上,GIT上的代码头文件和源文件分布在不同的文件夹下,直接使用Beyond compare来比较的话,不是什么好的体验,非常麻烦。于是我在想有什么好办法能更快速的解决这个问题。

问题梳理:

- 文件夹名称发生变化

- 文件内容可能有变化,需要对比同步

- 文件名保持不变

终于想到一个相对简便的方法,先分别把需要对比的.h/.c/.cpp/.java全部从svn和git找出来,复制到其他文件夹下。

使用shell命令查找所有的源文件

使用下命令分别将git和svn上的代码,复制到不同的文件夹下:

#查找当前目录下所有的.c/.h/.cpp/.java文件,然后复制到test目录下
cd git
find . -name "*.c" -o -name "*.h" -o -name "*.cpp" -o -name ".java" | xargs -i cp {} ../testgit/

#复制svn代码
cd ../svn
find . -name "*.c" -o -name "*.h" -o -name "*.cpp" -o -name ".java" | xargs -i cp {} ../testsvn/


手工合并

使用Beyond Compare比较testgit vs testsvn,将testsvn中的修改合并到testgit中去

替换合并后的文件

将文件合并好后存于testgit中,而原文件位于git文件夹中的不同的目录下,如何合并进去呢?这里用到了shell脚本。如下所示:

#!/bin/sh

#同上,查找git中所有的源文件和头文件,将其重定向到文件/tmp/1.txt中,其中保存的是类似信息
#./resource_manager/bus/server/resourcemanager_bus_server.c
#./app_manager/am_main.c
#./app_manager/inc/am_api.h
#./app_manager/src/am_api.c

find . -name "*.c" -o -name "*.h" -o -name "*.cpp" -o -name ".java" 1>/dev/null > /tmp/1.txt

echo "now porcess 1.txt..."

#根据1.txt中的文件绝对路径,提取文件名,将对比后位于testgit中的文件复制到1.txt中指定的绝对路径处,实现文件替换
while read line
do
#echo $line
#获取文件名如am_api.c
filename=${line##*/}

#对比后更新的文件位置
toCompareFile=../gcode/$filename
#echo $toCompareFile

#对比git 和 testgit中的代码,如果有差异则拷贝过去
diff $line $toCompareFile 2>&1 1>/dev/null
rc=$?
#echo $rc

if [ $rc -eq 1 ]
then
echo "$line is different, then copy it"
cp -f $toCompareFile $line
fi
done < 1.txt

rm -f /tmp/1.txt

echo "process finished..."


好了,大功告成!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: