2009-11-19 17 views
10

我會在版本控制下將大量數據,即一個目錄結構(深度爲< = 5)與數百個大小約爲500Mb的文件放在一起。git是否值得管理大於500MB的文件

我需要的東西是一個系統,幫助我: - 檢測是否文件已更改 - 檢測是否添加文件/刪除 - 克隆整個存儲庫中的另一個位置 - 來存儲「檢查點」並稍後恢復

我不需要sha1進行更改檢測,更快的操作是可以接受的。

git值得嗎?有更好的選擇?

回答

10

正如我在「What are the Git limits」中所提到的那樣,Git不是用來管理大文件(或者是大的二進制文件)。

,如果你需要的Git將需要:

  • 知道一個文件中實際上已經改變了。但對於目錄級別而言,其他答案更好(Unison或rsynch)
  • 保持開發數據和這些大型資源之間的緊密接近(即「相同的參考」)。只有一個引用會有幫助,但是然後你需要一個Git的分支,如git-bigfiles來有效地管理它們。

注:仍使用Git,你可以嘗試this approach

不幸的是,rsync是不是我們的目的真的是完美的。

  • 首先,它不是一個真正的版本控制系統。如果你想存儲文件的多個版本,你必須做多個副本,這是浪費的,或者它們是冗長的(並且可能很慢重新組裝,並且很難修剪中間版本),或者檢查它們git,它仍然會因爲你的文件太大而解體。
  • 加上rsync真的無法正確處理文件重命名 - 完全可以。

好吧,那另一個想法:讓我們分裂文件成塊,並檢查每個區塊的到Git的單獨
然後Git的增量壓縮不會有太多的時間去啃,而我們只需要發送修改的塊...基於gzip --rsyncable

,具有POC available in this Git repo

0

也許像rsync的是你需要更好的(如果你只是想要一些備份,沒有併發,合併,分支等)

1

Unison File Synchroniser是維護大型二進制文件的多個副本的優秀工具。除了存儲檢查點之外,它會完成你所要求的一切 - 但你可以使用rsync硬鏈接拷貝來完成。

1

如果你是在UNIX系統上(可能是,由於您使用的git):

  • 使用混帳回購協議爲所有的小東西。
  • 將大文件從單個「large_files」文件夾符號鏈接到存儲庫中的相應位置。
  • 使用更傳統非版本控制的備份系統來備份large_files文件夾,如果您需要將其傳遞給其他人,則他們會不時將它們捆綁到一個zip文件中。

這樣一來,你的git的好處,你把任何你想要的樹結構,和其他地方,大尺寸的文件進行備份儘管他們看上去仍然是正常的文件夾層次結構中。

8

git-annex是解決這個問題的方法。它不是直接在git中存儲大文件數據,而是將其存儲在鍵/值存儲中。然後將密鑰的符號鏈接檢入git,作爲實際大文件的代理。

http://git-annex.branchable.com