20111202

shell助我去战斗

shell助我去战斗

客户催进度的消息传来几次,我恨恨地想:再催再催,我就把你们全带去封闭开
发。好吃好喝,不让睡觉,天天干活。

我估算了一下,担保不等项目结束,客户全过劳死光,我一定还能幸存。

编码间歇看邮件,ZHUMAO同学带来噩耗,他要暂时关闭我们的GIT服务器,得备
份。

不少项目都有单儿的 git repository,在ZHUMAO的服务器上中央存储。关键是,不
少,我得把它们全pull一次,有些不紧急的,我已经一段时间没pull了。

恩。背影知识:git是一种版本控制系统,版本控制就是你写一大篇文章,中间
的很多过程都要记录下来,留着有用。pull,就是把git服务器上的东西整下来。

一个个项目。一个个进入那些目录,pull,然后再进入下一个目录。

非常不好。那么,编段程序完成这个任务吧。

编程序完成的好处在于:虽然花了时间,可能是等长甚至更长的时间,却可以更
容易保证质量。

这好比你打算用蜡烛做十个小兔子,如果一个个用手雕刻,那个每个的质量都是
无关的。如果花时间做个模具,那么,只要有一个小兔子是质量过关的(并且工
艺上,比如温度,控制得当),那么其他所有的小兔子就都是质量过关的。

1. 统一规格

我找到所有的配置文件,把 remote 和 url (就是远程的git服务及指定上面的
项目)都改成相同的。

当然,可以编个awk&sed程序直接改了,但是我没那个功力,且学会了"对付一下
得了,不要么通用"的原则。所以,我找到每一个 不符合 要求的配置文件,然
后手动修改。

这么找:

: find . -name config | xargs grep -i ".231" -nH

-nH参数的作用是打印是哪个文件的哪行命中了。

2. 写个程序,遍历目录,挨个pull

就这样:

1 for i in $(ls -d */)
2 do
3 echo pulling $i
4 cd $i
5 convmv * -r -f utf-8 -t gb2312 --notest > /dev/null 2>&1
6 git pull origin master
7 convmv * -r -f gb2312 -t utf-8 --notest > /dev/null 2>&1
8 cd ..
9 done

啥意思呢?

第1行,for是个循环,它将令变量i遍历 $() 里的东西,即 ls -d */。

ls -d */ 的作用是列出当前目录下所有的目录。

第2行至第9行,是循环体。在每次循环时,都完成以下任务。

1. 第3行,显示当前正pull谁呢,让我心里有个数。不然,通常我就等不及强制
结束了。

2. 第4行,进入以$i这个变量为名的目录。

3. 第5行和第7行,是把文件名在utf-8和gb2312间编码转换。原因是:a.祖国尚
未统一世界,万码奔腾的局面还会存在很多年;b.虽然通知了所有的程序员不要
使用中文文件名,大家还是有时候会忘。

解释一下"> /dev/null 2>&1"的意思。> /dev/null 是把输出重定向到黑洞里
去,免得烦我。你肯定也有那感觉,多余的信息,不如没有。2>&1 的意思是把错
误信息,即出错时的报错信息也扔到黑洞里去。你看,我连错误也不想看到...跟
我们中的某些人类似。

4. 第6行,是核心,也就是 git pull origin master,从origin指向的url中
pull下东西,放到master分支中去。

为了核心的,我们真正要做的事,我们做了多少准备工作啊。而且,还有收尾工
作。

5. 第8行,收尾,回到上一级目录,以便继续遍历下一个项目。故事再次上演,
没有一点改变。

这个故事告诉我们,真正的我们想做的事,往往在一大堆看似无关和无聊的事情
当中。我们需要发现本质,同时,我们也需要有能力完成核心以外的事情。

这个故事还告诉我们,第8行,收尾工作非常重要。项目的开始并非开始于项目开
始的时候,而是开始于上一个项目结束的时候。

所以,令我们安慰的,如果当前有什么事情无法完成,那不是此刻的你的错误,
而是更早的你积累的结果。非常简单的推论,如果未来的你有什么事情无法完
成,其错肇始于此刻。

No comments: