SVN 設計初衷是保留完整歷史,但某些場景必須從倉庫中永久清除數據:
標準流程:「導出 → 過濾 → 創建新倉庫 → 導入 → 替換」
svnadmin dump /data/svn/project > project_original.dump
導出包含所有版本、所有變更的完整數據流。
# 排除單個文件
type project_original.dump | svndumpfilter exclude trunk/test.exe > project_new.dump
# 排除整個目錄
type project_original.dump | svndumpfilter exclude trunk/notallowed > project_new.dump
# 組合排除
type project_original.dump | svndumpfilter exclude trunk/test.exe trunk/notallowed > project_new.dump
關鍵參數:
exclude:排除指定路徑(支持正則)--drop-empty-revs:刪除因過濾導致變更為空的版本--renumber-revs:重新編號版本號,保持連續性svnadmin create /data/svn/project_new
svnadmin load /data/svn/project_new < project_new.dump
mv /data/svn/project /data/svn/project_backup
mv /data/svn/project_new /data/svn/project
注意:操作前務必備份,並通知所有用戶重新檢出。
> svnadmin dump E:/svn/project > aaa.dump
> type aaa.dump | svndumpfilter exclude /Software/Tags/test.exe > bbb.dump
> svnadmin create E:/svn/project_new
> svnadmin load E:/svn/project_new < bbb.dump
-r START:END 分段導出svndumpfilter3(SVN 1.10+):更快的過濾實現# 查看刪除歷史
svn log -v | grep -B5 "D .*filename"
# 恢復特定版本的文件
svn merge -c -REVISION_URL .
# 或
svn copy -r REVISION URL/FILE@REVISION LOCAL_PATH
svn commit -m "Restore deleted file"
| 場景 | 推薦方案 |
|---|---|
| 少量文件/小倉庫 | svndumpfilter 全量重建 |
| 大倉庫/頻繁清理 | 遷移 Git + BFG / git-filter-repo |
| 誤刪恢復 | |
| 敏感數據洩露 | 立即徹底刪除 + 密鑰輪換 + 通知相關方 |
SVN 歷史重寫屬高危操作,生產環境務必嚴格遵循「備份 → 測試驗證 → 通知團隊 → 執行替換」流程。