VSCode增加了保留檔案本地歷史功能,這篇文章就來帶大家聊聊VSCode中的歷史儲存策略,希望對大家有幫助!
昨天更新 VSCode,發現 VSCode 也增加了保留檔案本機歷史功能。回想起前不久為了讓 Yank Note 增加歷史記錄功能,摳破了腦袋,構思了好久歷史記錄儲存策略。感嘆要是 VSCode 早發售幾個月,我還能有個參考。 【推薦學習:《vscode入門教學》】
不過當我看了 VSCode 的歷史儲存策略後:這麼粗暴?
VSCode 1.66 版本的時間軸中可以展示檔案本地歷史了,效果是這樣
針對這個功能,VSCode 也增加了一些配置:
There are also new settings to work with local history:
#workbench.localHistory. enabled
- Enable 或 disable local history (default:true
).workbench.localHistory.maxFileSize
- File size limit when creating a local history entry ( default:256 KB
).workbench.localHistory.maxFileEntries
- Local history entries limit per file (default:50
).workbench.localHistory.exclude
- Glob patterns for excluding certain files from local history.workbench.localHistory.mergeWindow
- Intervalring in seconds duther further changes are added to the last entry in local file history (default10s
).
右鍵點選歷史條目,有選單可以直接在系統管理員中找到文件某個歷史記錄的副本。
因此可以推斷出,VSCode 為每一個保存/撤銷等操作,在一定時間視窗(預設為10s)內,儲存一個檔案到資料夾。透過特殊的文件命名(保留時間資訊)來定位歷史記錄。
這也太粗糙了,一個檔案就是一個版本唄。
然後說下當時研究的 Typora 的策略。 Typora 在 macOS 上有非常精美的文件歷史回溯介面
#看樣子它應該是用的系統的「時間機器」來實現版本回溯的。所以這個功能在 Windows 上也就沒有了。
我設想中的歷史版本,有幾個目標:
最重要的目標是盡量避免資料遺失。
歷史記錄不要佔用太多體積,最好能增量記錄。
極端情況下要方便使用者還原資料。
歷史記錄應該可以標記和備註
#針對第一個目標,我希望能保留使用者最近的編輯版本,不要捨棄。而 Yank Note 有自動儲存功能,也就有了第二個目標,不要佔用太多空間,也不要產生太多檔案。所以最開始想的類似 VSCode 那種,時間窗口 檔案保存的策略,就不行了。
針對第三個目標,我不想引入自訂的格式,例如 Git,或資料庫。因為如果使用者遺失了數據,在軟體也不方便找到歷史記錄的情況(軟體損壞,檔案誤刪等),使用者要可以進入歷史目錄,把檔案找回來。
後續:有個使用者誤刪了一個文檔,回收站也找不到了,就透過這種方法恢復的。
再考慮第四個目標,最後我選擇了使用zip 檔案的方式來保存檔案歷史版本,雖然在寫入和讀取歷史上會消耗一點運算效能(10多兆大文件歷史記錄也基本上沒感知),但最終效果還是很好的。
最終方案:
每個文件由檔案名稱和路徑Hash 拼出一個zip 套件檔案名稱
每次寫入文件,同時往這個zip 檔案中寫入一個新版本檔案
移動和重新命名檔案時候同步更改zip 檔案的名字
最大歷史版本數可以做一個限制。
版本備註和標記資訊可以存在壓縮的備註欄位中。
通常會編輯一個文件的時候,由於自動保存的機制,當前版本和上一個版本之間的差異很小,因此理論上往壓縮文件中添加一個新的版本文件,壓縮檔案整體大小增加應該很小才對。不過後來發現並非如此,這時我才意識到 Zip 檔案壓縮的特性:每個檔案分別壓縮,再合起來打包。也即是說往壓縮包新增檔案的時候,並不會跟其他檔案一起壓縮。
針對這種情況,我採取兩次壓縮的策略:第一次把壓縮率設為 0,僅僅打包,這樣 zip 包內都是檔案的原始資訊。第二次將整個打包檔案壓縮一次,這下壓縮程式就可以考慮整體的資訊來做壓縮了,這就實現了「增量更新」的目的。
後面寫腳本測試,一個普通長度的文件,保存 1000 個版本,也才佔用 50KB。
使用了幾個月下來,我的歷史檔案目錄也才佔用 700 多 KB 的空間,裡面大部分歷史記錄檔案只有幾 KB 大小。反觀 VSCode,使用這兩天歷史目錄就佔了 2M。
針對歷史儲存,我還進一步想了一些保存策略
#相對於最後一次儲存時間,保留:
- 過去10分鐘內的每一個版本
- 過去1小時內每分鐘一個版本
- 過去24小時每小時一個版本
- 每日保留一個版本
- 已標記的備份
#不過目前看來是不需要了,目前的策略簡單,各方面也達到了我的預期。
更多關於VSCode的相關知識,請造訪:vscode教學! !
以上是聊聊VSCode中的歷史儲存策略的詳細內容。更多資訊請關注PHP中文網其他相關文章!