2010-06-18 33 views
2

我有一个项目,我不得不使用ftp作为将文件部署到活动服务器的一种方式。 我正在linux上开发,所以我一起砍了一个bash脚本,用来备份ftp服务器的内容, 删除了ftp上的所有文件,并从mercurial存储库上传所有新文件。 (并照顾用户上传的文件和文件夹,并进行部署后更改等)从shell脚本增量部署

它运行良好,但项目开始变得足够大,使部署过程过长。

我想修改脚本来查找哪些文件已经更改,并且只部署修改后的文件。 (备份很好,atm)

我使用的是mercurial作为VCS,所以我的想法是以某种方式请求两个修订版之间的修改文件,迭代修改后的文件, 并上传每个修改文件,并删除每个删除的文件。

我可以使用hg log -vr rev1:rev2,从输出中,我可以用grep/sed/etc分割出已更改的文件。

两个问题:

我听说过的恐怖故事,解析LS的输出导致精神错乱,所以我的猜测是,这同样适用于这里, 如果我尝试解析的hg log输出时,变量将经历分词和各种变换。

hg log不告诉我一个文件被修改/添加/删除。区分修改和删除的文件将是最不重要的。

那么,这样做的正确方法是什么?我使用yafc作为ftp客户端,以防万一需要,但愿意切换。

+0

rq使用'hg status'(不是日志)在下面给出你的答案。不用担心使用mercurial解析输出 - 作者非常小心地将命令的输出从版本更改为版本。 这就是说,我是你,我会避免滚动自己的增量更新。只需将所有内容发送到服务器上的新目录,然后将新的临时名称重命名为旧的,网络可见的名称。 – 2010-06-18 17:25:24

回答

3

您可以使用自定义样式为您解析。

hg log --rev rev1:rev2 --style mystyle 

然后将其管道到sort -u以获得唯一的文件列表。文件“mystyle”看起来是这样的:

changeset = '{file_mods}{file_adds}\n' 
file_mod = '{file_mod}\n' 
file_add = '{file_add}\n' 

mods和添加模板是文件修改或添加。对于删除的文件,有一个类似的file_delsfile_del模板。

或者,你可以使用hg status -ma --rev rev1-1:rev2它增加了一个中号一个修改前/添加的文件。您需要传递一个不同的版本范围,比rev1小1,因为它是自“基准”以来的状态。删除的文件类似 - 您需要-d标志,并在每个删除的文件之前添加一个D

+1

您的hg状态解决方案要好得多,因为它结合了范围内所有变更集的列表,而不是单独列出它们。 – 2010-06-18 17:24:40

+0

但是如果我使用hg st的输出,同样的问题不会出现?喜欢寻找文件名中的空格? – 2010-06-19 19:44:52

+0

'hg st -ma --rev a:b | cut -c3- |同时读取文件;用“$ file”做东西; done'不会给你文件名中的空格带来问题,因为你不能在空格上分割,只能在换行符上分割。 – richq 2010-06-20 09:31:33