2009年10月8日 星期四

備份尚未 submit 進 perforce 的檔案

有時候,我們會希望讓還沒進版本控制 server 的檔案也能備份下來,原因各有不同,有些人只是想移到別處繼續編輯,有些人是想丟給別人看看,而我是因為有一次才剛買半年的硬碟竟然就死掉了,痛失一堆檔案!
也許有些人會說就 check in 進 server 的 develop 暫存區之類的就好啦,但有時候我們就是覺得還不到該 check in 的時候,或是像本公司跟本沒這種制度。

今天心血來潮,打算解決這個問題,研究了那拖了十幾年沒去搞懂的 batch file 語法後,得到下面這一段 code:


for /F "tokens=1,5,6 delims=# " %%a IN ('p4 opened') do for /F "tokens=3" %%j IN ('p4 where %%a') do zip %%b_%%c.zip %%j

把它存成 bat 檔後再執行,就可以得像是如下的檔案:
change_571620.zip
change_673450.zip
change_723098.zip
default_change.zip

說明一下,本公司使用 perforce,要使用這個 batch file 需要安裝 p4 command 跟 zip,zip 可以在 unix tools 裡找到。
這段 batch file 是先呼叫 "p4 opened" 可以列出所有 opened for edit 的檔案,包括新增的檔案,然後取出出字串中檔案的 depot 路徑(token 1 -> %%a),以及 change list (token 5,6 -> %%b %%c),再將 depot 路徑透過 "p4 where" 來取得 local 路徑(token 3),然後把路徑跟 change list 名稱餵給 zip 就搞定了。
最後輸出指令範例:
zip change_571620.zip foo.h
zip change_571620.zip foo.cpp
zip default_change.zip bar.h
zip default_change.zip bar.cpp

使用 zip 的好處是可以很方便的完整保留目錄結構,而且也不會提示要不要覆蓋已經存在的檔案。所以我們可以很方便的將上述的 script 放進排程工具中,每天定時備份。
當然,請把備份檔的路徑設到別顆硬碟,最好是透過網路直接寫到別台電腦去,這樣才能確保萬無一失!