2013-02-19 244 views
4

我正在尋找一個工具,它可以幫助我分析存儲庫中不同文件的磁盤空間需求。分析SVN磁盤空間

在我的存儲庫中有更大的二進制文件和幾個修訂。

因此,我舉例來說,對於在存儲庫中使用單個二進制文件的所有修訂版本有多大空間感興趣。 AFAIK這個信息不容易通過'list'命令獲得,因爲我不知道svn的定義效率如何。

或者是其使用的磁盤空間最多(不僅在頭修訂,但在所有版本一起)

任何想法的文件/文件夾?

+1

你真正的解決方案是不存儲svn中的二進制文件。 – thekbb 2013-02-19 17:04:52

+0

感謝您的提交thekbb。我的項目不僅包含源代碼,還包含更大的測試數據,這些數據存儲在* .xlsx或Matlab * .mat文件中。我想利用版本控制的優勢也爲這些文件。 – user2087749 2013-02-20 07:53:47

+0

我知道這可能會導致磁盤空間問題。但在考慮不同的方法之前,我想知道它有多糟糕。這就是我的問題來自哪裏。 – user2087749 2013-02-20 08:02:00

回答

1

可以轉儲存儲庫並過濾舊的不需要的版本的二進制文件,然後將轉儲加載回同名的存儲庫。

什麼是你的工具/構建看起來像?

要記住的另一件事 - 如果你曾經遷移到git或hg,每次克隆時都會拉下這些二進制文件的整個歷史記錄......所以磁盤空間也會成爲客戶端的問題。

+2

我讀過很多SVN可以對二進制文件做增量轉換的地方,這是不是真的?例如http://stackoverflow.com/questions/538643/how-good-is-subversion-at-storing-lots-of-binary-files – 2013-02-20 15:51:37

+0

@JamesP正確地指出了我的錯誤 - svn的確在二進制文件中存儲delta。謝啦。 – thekbb 2013-02-20 21:20:26

5

節點在Subversion中使用多少存儲並不像看起來那麼直截了當。我將要討論FSFS(並且只提供FSFS的答案),因爲這幾乎可以肯定你正在使用的文件系統實現。如果你使用BDB,事情會有所不同。

節點可以用4種方式存儲存儲空間。節點的實際文本或主體,屬性以及它們使用存儲在目錄節點中的存儲來指明它們的存在(目錄節點具有由其子節點的字典和子節點表示組成的主體),以及最後是文件系統的開銷(當你提交一個文件時,它會將根目錄中的新目錄渲染出來,所以我認爲存儲的使用應該屬於需要存儲的文件) 。

文件文本和屬性所佔用的空間相對較容易實現,目錄存儲和開銷較大。然而,即使對於文件文本相對容易的問題,由於表示共享,它仍然有點複雜。當兩個文件相同時(文件可以具有相同的名稱,或者不是無關緊要,唯一重要的是它們的文本是相同的),代表性共享發生。我們避免再次存儲它。

下面的一行代碼應該回答單個文件的文件文本問題。

REPO=~/my-repo; FILE=/somebigfile; grep --recursive --no-filename --text --before-context 3 "cpath: $FILE" "$REPO/db/revs/"* | grep 'text:' | cut -d' ' -f 1-7 | sort -u | awk '{ DISK+=$4; if ($5 == 0) { FULL += $4 } else { FULL += $5 } } END { print DISK, FULL, FULL-DISK}' 

你需要改變REPO設置爲路徑到您的資料庫和文件被存儲庫到你想要的文件中的絕對路徑。這可能不完美,因爲我可能忘記了一些細節或其他。但讓我來看看它是如何工作的。

它會查找您要查找的文件的每個修訂文件,請求前面的3行以及匹配行。然後除去文本行之外的所有內容:在它們上面(詳細說明文本表示的行)。然後我們排除最後一個字段(唯一性;它用於區分共享表示)。這允許我們將其限制爲我們實際存儲的唯一表示。然後,我們總結第5和第4個字段(分別是全文大小和表示大小)。全文大小可以爲零,這意味着它與表示大小相同(我們存儲全文而不是三角洲)。最後,我們打印出下列字段:實際存儲時的大小,全文本中所有版本文件的大小,以及最後的差異(負數表示我們的效率低於存儲明文,正數表示我們節省了太多空間)。是

文本數據的字段如下:

revision offset_in_rev_file size_of_rep size_of_full_text md5 sha1 uniquifier 

以前的版本庫可能沒有所有這些領域的,這很好。

因爲我依賴文本字段在rev文件中的cpath字段的3行內(嘿,這是一個快速入侵),它可能無法正常工作。您可能希望運行前兩個grep命令而不用其他所有命令,然後查看提供的修訂版(它們將是左側的第一組數字)。將該文件的輸出結果與svn log進行比較。如果所有的轉速都在那裏,那就應該是準確的。

如果我找到時間,我會嘗試寫一個實用的方法(使用SVN庫),這是更有用的。可能會包含屬性使用的存儲空間,也可能包括上面提到的其他一些存儲空間。

TL; DR這不是一個容易回答的問題。使用上面的shell腳本來回答文件文本的存儲。它會給你輸出的是我們在磁盤上使用的空間,所有修訂版全文的空間,然後我們保存了多少(負面意味着我們由於增量開銷而損失了空間)。

+0

謝謝Ben Reser!這個腳本幫助我回答我的一些問題。 – user2087749 2013-02-21 09:29:56