1. 程式人生 > >hg提交大檔案時候提示255錯誤的解決方案

hg提交大檔案時候提示255錯誤的解決方案

客戶端出外部版本,通常要保留pdb檔案,以利於出現崩潰時,生成的dump檔案能夠快速定位。通常除了把exe/pdb打包傳一份到內部的檔案伺服器的同時,我也採用hg做本地版本庫管理。

版本出了十多次以後的某次,發現提交出錯了,TortoiseHg提示error code是255。排查後發現是去除其中最大的一個pdb(數十M大小),其他的可以正常提交。

上網google下,大檔案管理是hg的軟肋。倒也不至於某些文章說的那樣hg官方不支援什麼的,事實上,hg從2.0開始(見http://mercurial.selenic.com/wiki/WhatsNew) 就官方已經集成了一個大檔案外掛,即Largefiles extension 見 http://mercurial.selenic.com/wiki/LargefilesExtension

需要注意到是,雖然包含了此外掛,但必須配置開啟後才可以通過命令列使用。配置方法見http://mercurial.selenic.com/wiki/UsingExtensions


若是圖省事,可以直接進行全域性的配置:

修改使用者目錄 (開始->執行->%USERPROFILE%) 下的mercurial.ini,在檔案末新增這兩行

[extensions]
largefiles =


比較推薦的做法針對性的經對需要的版本庫做這個處理,例如我對外部版本備份啟用此外掛,而對平時開發用的版本不啟用此外掛,在.hg下新增hgrc檔案(如果不存在的話),在文末新增這兩行。


在啟用largefiles的情況下(全域性啟用,或當前路徑的版本庫獨立啟用),可以使用命令列把舊有版本庫進行轉換。

hg lfconvert --size 10 oldrepo newrepo

轉換後的庫,提交大檔案即成功了。



附註:

1. 這個外掛會破壞hg這種DVCS原先把完全的版本資訊儲存在本地的優勢。

   在啟用這個外掛前,hg的原始倉庫,和clone出來的所有倉庫都是平等的,都包含有完整的歷次版本內容。而被當成largeFile處理的檔案不同,只有原始倉庫在.hg\largefiles保留所有大檔案的歷次版本,而clone出來的倉庫,在.hg\largefiles只存有每個largeFile的當前版本(而不是歷次版本)。LargeFile的儲存,有中心倉庫的概念。這點與hg/git等的思想算是背道而馳了,也導致了一些侷限性。

詳見外掛的官方說明:http://mercurial.selenic.com/wiki/LargefilesExtension
一些討論 http://kiln.stackexchange.com/questions/4846/how-do-i-use-the-mercurial-largefiles-extension


2. 曾經也考慮過直接給版本庫轉為git來做,git的大檔案可以隨便提交,當然還有諸如效率更高之類的好處,粗略的記錄下吧

a. fast-export http://repo.or.cz/w/fast-export.git,這個的好處是比 HgGit 外掛快。
b. fast-export 是unix語法的,要安裝cygwin
c. 比較悲劇的問題是,我們的專案中有一個說明檔案不幸是中文命名的,轉換過來會亂碼,cgywin中的git版本較老
   下載了新版本git,據稱對中文檔名有改善的1.7.10以後的版本,在cgywin中編譯,參考:
   1. 在Cygwin中編譯Git http://zengrong.net/post/1817.htm
   2. 上文提到的問題我貌似都沒遇到,倒是在configure的時候,提示checking whether the C compiler works... no,
      可是我gcc/make/curl等等都裝了,研究了好一段時間才知道還得加這個:mpfr (cygmpfr-4.dll)。見                http://wangjunle23.blog.163.com/blog/static/117838171201110853555933/
      ……我這裡configure到時候沒提示mpfr這東西,可是加上就能編譯了
d. 遺憾的是,hg/git都更新到支援中文檔名的版本了,fast-export還是搞出亂碼了。考慮到這裡用途只是做備份,git大材小用了,自己在github的專案不至於會弄箇中文檔名放著,當時又找到了此外掛,就沒折騰了。