之前 Heresy 有整理過一篇《使用 TortoiseGit 將 SVN 轉移到 Git 的紀錄》,試著去把 SVN 的程式轉移到 GIT 的環境;不過當時因為還有其他事,所以只是先測試、並沒有完全完成。而最近,算是有真的需求、需要做轉移的工作了,所以又把他撿回來、試著做了一下。
結果,感覺似乎是因為 SVN 的東西又變多很多了,結果現在用 Git 取得 SVN 的資料的時候,跑到一半就會出現錯誤訊息了…下面就是錯誤訊息:
Auto packing the repository for optimum performance. You may also run "git gc"
manually. See "git help gc" for more information.warning: suboptimal pack - out of memory
fatal: Out of memory, malloc failed (tried to allocate 98849273 bytes)
error: failed to run repack
gc --auto: command returned error: 255
git did not exit cleanly (exit code 1) (13256532 ms @ 2015/--/-- --:--:--)
這個錯誤,基本上應該就是在執行「git gc」的時候,記憶體不夠他去配置,導致觸發了記憶體不足的錯誤。
不過雖然說是記憶體不足…但是 Heresy 工作的電腦可是有 64GB 的記憶體、都還沒用啊~而且真的認真去看,其實 Git 的程式用的記憶體量,也沒有爆炸性地增加啊?再加上錯誤訊息中,他試著去配置的記憶體也不過 100MB 不到,結果就說記憶體不足?所以,其實 Heresy 也搞不清楚問題在哪?
後來找了一下,網路上也有人有碰到類似的問題,例如《Git on Windows, "Out of memory – malloc failed"》這篇討論的問題,基本上就和 Heresy 碰到的問題是一樣的。
根據文章的解法看來,這個問題應該是 Git 本身設定檔的記憶體限制需要修改才行。他的建議,是在設定檔裡面加上下面的設定:
[core] packedGitLimit = 128m packedGitWindowSize = 128m [pack] deltaCacheSize = 128m packSizeLimit = 128m windowMemory = 128m
而如果是在 Windows 下安裝 TortoiseGit 的話,他預設安裝的 Git 設定檔應該會是「C:\Program Files (x86)\Git\etc\gitconfig」這個檔案。
不過…Heresy 看到這才發現,雖然 Heresy 裝的 TortoiseGit 是 64bit 的,但是他預設去裝的 Windows 版 Git 卻是 32 位元的(而且還是 1.9.5、2014 的版本…)!?這難怪在記憶體還很空的時候,就會喊記憶體不足了啊…
而實際上,Heresy 照他的建議下去改,還是會有一樣的問題。後來又研究了一下,這才發現,他的記憶體使用量和 CPU 的核心數目也有關係;他預設會用最多的執行序下去跑,而這邊設定的記憶體似乎是每個執行序都的上限,所以當 CPU 核心多的時候,整體記憶體用的自然也比較兇了…
所以,如果要繼續用 32 位元的 Git 的話,要不就是得再把記憶體條小,不然就是要限制執行序的數量、讓他跑慢一點了… orz
最後呢,Heresy 是發現,現在 http://git-scm.com/ 上最新版已經是 2.6.4,而且還有提供 64 位元版!所以,其實只要把本來的 git-scm 移除、然後安裝最新的 64 位元版本,基本上就沒問題了…
不過話說,TortoiseGit 自己有更新都會跳出來通知,結果核心的 GIT 程式居然都沒去檢查版本…這點感覺有點不直覺啊… @@
總之,如果是很在 Windows 早就把 Git 裝起來的人,記得手動更新一下 git-scm 吧…