2010-06-18 32 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