Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 从shell脚本增量部署_Bash_Deployment_Mercurial - Fatal编程技术网

Bash 从shell脚本增量部署

Bash 从shell脚本增量部署,bash,deployment,mercurial,Bash,Deployment,Mercurial,我有一个项目,在那里我被迫使用ftp作为将文件部署到实时服务器的手段。 我是在linux上开发的,所以我拼凑了一个bash脚本来备份ftp服务器的内容, 删除ftp上的所有文件,并从mercurial存储库上载所有新文件。 (并负责用户上传的文件和文件夹,以及进行部署后更改等) 它工作得很好,但是项目开始变得足够大,以至于部署过程太长 我想修改脚本以查找哪些文件已更改,并且只部署修改后的文件。(备份很好) 我使用mercurial作为VCS,所以我的想法是在它的两个版本之间请求更改的文件,迭代更

我有一个项目,在那里我被迫使用ftp作为将文件部署到实时服务器的手段。 我是在linux上开发的,所以我拼凑了一个bash脚本来备份ftp服务器的内容, 删除ftp上的所有文件,并从mercurial存储库上载所有新文件。 (并负责用户上传的文件和文件夹,以及进行部署后更改等)

它工作得很好,但是项目开始变得足够大,以至于部署过程太长

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

我使用mercurial作为VCS,所以我的想法是在它的两个版本之间请求更改的文件,迭代更改的文件, 和上载每个修改的文件,并删除每个删除的文件

我可以使用hg
log-vrrev1:rev2
,从输出中,我可以用grep/sed/etc雕刻出更改过的文件

两个问题:

我听说过这样的恐怖故事,解析ls的输出会导致精神错乱,所以我猜这里也是如此, 如果我试图解析
hglog
的输出,变量将经历单词拆分和各种转换

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


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

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

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和adds模板是修改或添加的文件。对于删除的文件,有一个类似的
文件删除
文件删除
模板


或者,您可以使用
hgstatus-ma--revrev1-1:rev2
,在修改/添加文件之前添加M或A。您需要传递一个不同的修订范围,比rev1小一个,因为这是自“基线”以来的状态。删除的文件是相似的-您需要-d标志,并且在每个删除的文件之前添加一个d。

您的hg状态解决方案更好,因为它合并了范围内所有变更集的列表,而不是单独列出它们。但是如果我使用hg st的输出,不会出现同样的问题吗?喜欢在文件名中寻找空格吗?
hg st-ma--rev a:b | cut-c3-|读取文件时;使用“$file”进行操作;“完成”
不会给您带来文件名中空格的问题,因为您不会在空格上拆分,只会在换行符上拆分。rq使用
hg status
(而不是log)在下面列出您的答案。不用担心使用mercurial解析输出——作者在将命令的输出从一个版本更改为另一个版本时非常小心。也就是说,如果我是你,我会避免滚动我自己的增量更新。只需将所有内容发送到服务器上的新目录,并将新的临时名称重命名为旧的、web可见的名称。