一、準備鏡像 SVN
從 7 月下旬開始,隨着文派新服務器的到位,我便着手將 WordPress 的四個主要存儲庫 (themes 、 plugins 、 core 、 i18n) 鏡像同步到國內。 WordPress 的這些存儲庫基於 SVN 架構,而非如今流行的 Git 。這是因為在 WordPress 誕生時,Git 尚未出現。
起初,我打算直接使用svn checkout
命令來下載存儲庫內容,但很快就 pass 了。原因是svn checkout
並不支持斷點續傳,且 WordPress 的存儲庫規模龐大,特別是插件庫,其大小已達到 TB 級別。使用此方法無法穩定地將如此大量的數據從境外傳輸至國內。
經過一番搜索,我發現了svnsync
命令,這個工具能夠遞歸同步目標存儲庫的所有版本號,並將這些版本順序提交到本地的空存儲庫,直到與目標版本號一致。svnsync
天然支持斷點續傳,也便於同步後續的提交內容。
得益於 AI 的幫助,我很快寫好了同步腳本,並啓動了四個存儲庫的同步任務。然而,事情並沒有這麼順利結束。同步過程中,插件庫報出了錯誤:e175009: the xml response contains invalid xml
,導致同步卡在了版本號2231806
,無法繼續。
排查問題的根本原因並不是最重要的 (SVN 本身存在很多歷史遺留問題,WordPress 的 SVN 版本甚至是十幾年前的 1.7 版),我需要儘快解決問題以恢復同步。
經過一番調查,我找到了一個可能的解決方案,靈感來自一封 14 年前的郵件記錄 Subversion Dev: Re: Question on svnsync – want to quickly start from rev 800000 (haxx.se)。
最終方法是手動修改存儲庫的數據庫文件,通過假提交的方式跳過有問題的版本號。
具體操作是使用svnmucc -m "FIX" put FIXFILE
命令,將一個偽造文件提交到插件存儲庫的根目錄,並手動調整版本號數據。雖然之後報出了文件不一致的錯誤,但這次給出的提示信息明確指出了具體的插件目錄。檢查後發現該插件已廢棄,我手動下載了該插件的源碼,並使用svnmucc
命令提交後,問題得以繼續解決。
在後續同步過程中,遇到類似問題時,我都採取了相同的方法,直到 9 月的一天。
二、搭建 SVN 服務器
在等待同步完成的同時,我也開始着手搭建自己的 SVN 服務器。經過一番研究後發現,Apache+mod_dav_svn
是唯一可行的方案。雖然過程繁瑣,但對我來説,這些並不是難題。
我很快查到了編譯mod_dav_svn
模塊的參數,因為很多文檔已經過時,我經過反覆多次調整,最終成功編譯安裝了所需模塊。以下是使用的配置命令:
./configure --with-apxs=/www/server/apache/bin/apxs --with-apache-libexecdir=/www/server/apache/modules --with-apr=/www/server/apache --with-apr-util=/www/server/apache --with-lz4=internal --with-utf8proc=internal
需要注意的是,編譯前需要安裝libserf-dev
庫,否則編譯後的 SVN 版本將不支持 HTTP 協議。
在完成這些準備工作後,我順利搭建了 SVN 服務器開始提供已同步鏡像的訪問服務。
三、簽出速度緩慢
隨着同步工作的推進,另一個問題逐漸暴露出來——簽出的速度極為緩慢。對主題庫進行一次簽出操作需要超過 1 小時,而未來插件庫的簽出時間預計是主題庫的 10 倍。
這一問題的根源在於 SVN 在執行簽出時需要掃描整個存儲庫的內容。目前,我還沒有找到有效的優化手段,只能通過減少簽出的頻率來暫時緩解此問題。
順便提一句,雖然 Git 也存在類似問題,但相對而言,其影響要小得多。
四、問題深入研究
9 月初,我再次遇到了之前的報錯,但這次的情況有所不同。錯誤的提交包含大量文件,且該插件依然在活躍維護,因此不再適合使用之前的假提交方法繞過問題的提交。
於是,我決定深入研究該問題的根源。首先,我向 SVN 社區發送了詢問郵件,社區建議更新 SVN 到最新版本進行測試。顯然我無法讓 WordPress.org 更新他們的 SVN 版本,只能自行在本地進行實驗。
我創建一個新的 SVN 存儲庫並進行深入研究,最終發現了一個屬於 SVN 本身的漏洞 (或者説是 Bug) 。目前此問題已反饋給 SVN 社區,等待他們的進一步確認。
在他們正式修復問題且 WordPress.org 更新版本之前,插件庫的同步暫無法繼續。
總結
我自 7 月中旬開始鏡像 WordPress SVN 存儲庫,直到目前 9 月下旬仍未能全部完成且無法給出預計完成時間。
我在此過程中遇到了很多問題,搜索了不知道多少篇文章,不少文章甚至有 10 年以上的歷史,可見目前 SVN 的使用率之低。
項目莫用 SVN,老老實實 Git 。
發表回覆