2016-12-14 45 views
0

我有人要求使用Git將大型二進制文件作爲一次性工作在2人之間傳輸文件)。他有一些網絡問題阻止他使用標準工具(如Dropbox,GDrive,Ftp等),但與我的Git倉庫完全連接。Git:有沒有一種安全的方式來刪除分支,包括所有提交/歷史記錄,以恢復原始回購大小

我最大的擔心是允許他這樣做,這會增加我的回購規模。即使他創建了一個新的分支,對二進制文件進行了提交,並且刪除了對方成功提取的分支,repo會不會保留與該提交相關的歷史記錄?

如果該文件相當大(100M),即使分支被刪除,我的回購也不會增長那麼多嗎?我需要做些什麼才能將repo重新縮回預提交大小?

+0

我不這麼認爲;在我的快速實驗中,即使'git gc --prune = all --aggressive'都不起作用,'git'手冊頁建議不要使用'--prune = all',因爲它在某些情況下不安全。 –

回答

1

一旦所有引用一些承諾(S)和其相關的文件(S)-really,基礎Git對象(即那些提交去樹木和斑點)-are沒了,對象成爲資格垃圾收集。然而,他們實際上並不會收集收集,直到某些東西運行git gc(或git prune它們至少與「修剪時間」一樣長。

默認剪枝時間是兩週,但您可以降低它,例如,git gc --prune=yesterday--prune=10.minutes.ago或類似。如果此時間很短,請確保沒有人在存儲庫中創建新對象。

擺脫全部對各種Git對象的引用可能比看起來更難。顯而易見的是分支名稱和標籤名稱。這些參考名稱通常也有推薦日誌,並且本身有一個額外的推薦日誌HEAD;所有這些reflog包含引用,然後保持對象活着。刪除分支名稱(當前)刪除分支的引薦日誌,但HEAD的引用日誌中的引用日誌保留。

的引用日誌條目本身到期,默認情況下,在90天內爲可達對象和可達者30天,與此可達性由相應的參考電流值來確定。如果只有HEAD reflog和HEAD本身沒有分離,那麼reflog引用指向一個不可達的提交(根據定義:如果HEAD附加到分支,然後HEAD只包含分支名稱,並且我們已經表示沒有分支名稱指向提交本身,也不指向提交的後代),因此只適用較短的到期時間。你可以用git reflog expire --expire-unreachable=...進一步縮短,使用相同的語法與git gc --prune=...,雖然你當然會被到期所有這樣引用日誌不可達的條目,除非你限制這HEAD(那麼你將撲殺只HEAD的可達條目)。

除了這些,有可能在特殊*_HEAD名字中的一個有一個參考(ORIG_HEADMERGE_HEADCHERRY_PICK_HEAD,等等)。不過,這種情況不太可能發生。

相關問題