2013-02-20 200 views
8

我有一些創建git subtree,我想垃圾收集(更多的任何實際目的只是爲了瞭解什麼和爲什麼可以收集)。垃圾收集提交git

我已經檢查了這些提交不被引用的有以下幾種:

# In any reflog 
> git reflog --all --no-abbrev-commit | grep <hash> 
(no output) 

# In any branch, local or remote 
> git branch --contains <hash> 
(no output) 
> git branch -r --contains <hash> 
(no output) 

# In any tag 
> git tag --contains <hash> 
(no output) 

# In the current index 
> git rev-list HEAD | grep <hash> 
(no output) 

# In references from filter-branch 
> ls .git/refs/original/ 
(the folder does not exist) 

這些都是地方git gc documentation列出可以包含引用。

仍然給定的提交在git gc之後仍然存在。

我錯過了什麼嗎?或者是否有任何git plumbing命令檢查所有這些引用?

回答

10

每一次我想刪除鬆散的對象,我用下面的命令:

rm -rf .git/refs/original/* 
git reflog expire --all --expire-unreachable=0 
git repack -A -d 
git prune 
+0

非常好,丟失的是重新包裝。如果包裝有可訪問的對象,則即使無法訪問的對象也不會被丟棄。所以'repack'將它們分開,然後'git prune'或'git gc'將正確處理它們。 – LopSae 2013-02-21 19:52:53

+0

即使使用'git prune',我的倉庫仍然有鬆散的對象。如果你遇到這種情況,'git gc' doc文件表明它非常難*保證安全並保留任何可能的引用。確保清理你的.git文件夾中的/ refs,/ logs,FETCH_HEAD和其他緩存。然後重新運行'git gc --prune = now'就可以了。 – jsgoupil 2014-05-28 19:05:55

6

提交(或通常的對象)只有在解包成鬆散物體並且至少2周後纔會被刪除。您可以使用git gc --prune=now跳過2周的延遲。

通常情況下,git會將你的對象打包到一個包文件中。這比鬆散物體提供更好的壓縮和效率。這通常發生在執行git gc時。但是,如果某個對象未被引用,則git gc會將其拆回鬆散物體。

一旦解包,git gc將自動修剪舊的鬆散的未引用對象。這由--prune=<date>標誌控制,該標誌默認爲2周前,因此它會修剪任何舊的未超過2周的未引用對象。通過指定--prune=now,您要求git gc修剪任何比現在更早的對象,這基本上意味着修剪任何存在的未引用對象。

+0

嘗試這樣做,仍然承諾不收集。 – LopSae 2013-02-21 00:13:45

+2

@LopSae:你有沒有試過運行'git fsck --unreachable'來確保你的提交是真正無法訪問的? – 2013-02-21 00:14:26

+1

剛剛嘗試過,並沒有顯示,這意味着從某處可以到達,但我無法從哪裏找到。 – LopSae 2013-02-21 00:24:33