2017-10-12 112 views
0

an answer of 「How often should you use git-gc?」git gc會自動運行每次推送到遠程的時間。甚至當我推到遠程,GC不會出現運行

我評論了答案,但一直沒有得到迴應,所以我問在這裏。

我在我的樹中有無法訪問的提交(作爲git commit --amend的結果)。這可以通過git log --reflog進行驗證。我將分支推送到遠程存儲庫並再次檢查我的樹;無法訪問的提交仍然存在。當推送發生時,顯然git gc未運行。 ...?

實施例:

$ git commit -m 'commit A' 
$ git commit -m 'commit B' 
$ git commit -m 'commit C' 
$ git commit --amend -m 'commit D' 
$ git commit -m 'commit E' 
$ git commit -m 'commit F' 
$ git push origin master 
$ git log --reflog 
* commit F (HEAD -> master, origin/master) 
* commit E 
* commit D (an amendment of C) 
| 
| * commit C 
|/ 
* commit B 
* commit A 

當我主推到遠程和運行git log --reflog,提交C是仍然可見。即使提交C超過30天,情況仍然如此。我想git push自動運行git gc,我想git gc刪除不可達的提交(在這種情況下,C)。我錯過了什麼嗎?

+0

你期望提交消失的哪個回購? 'git push'會在遠程repo_上執行'git gc'。 –

+0

您也可以在這裏找到heisenbug問題:我相信reflog本身可以表示對提交的引用。 –

回答

0

在互聯網上經過一番研究,我發現,根據this答案在計算器:


的Git決定是否自動GC based on two criteria

  1. 是否有太多的包? (從字面上看,有沒有more than 50 files.idx.git/objects/pack?)
  2. 是否有太多的鬆散對象? (從字面上看,有沒有more than 27 files in .git/objects/17?)

如果由於某種原因Git是不能在該目錄合併包文件或刪除鬆動物體,它會認爲它需要再下一次自動GC。


但是基於什麼this書上說我們有:

Git的自動運行的垃圾收集,如果:

•有在倉庫中過多的鬆散物

•一推到遠程倉庫發生

•某些命令後這可能會引入許多散裝物品

•當一些命令如git的引用日誌到期明確要求它

,但我找不到WHICH命令實際上觸發該命令的任何地方。我的猜測是沒有真正的規範定義,它不依賴於你正在使用的執行/版本。

無論如何,這本書明確指出,你是正確的,推後這個命令被觸發,但我無法在任何地方找到確認。

我不是git push文檔here,它說,除非你運行後git gcgit push會有可達提交的例子中找到的。

0

你假設提交將立即被垃圾收集,但git實際上將等待30 days by default,直到它刪除不可達的提交。此行爲可以通過gc.reflogExpireUnreachable配置設置進行更改。

+0

,但即使30天以上的無法訪問的提交仍未被刪除。我已經承諾超過一年還留在回購中!對不起,應該在我的問題中提到這一點。 – chharvey

0

你能做到這一點,除去可達來自本地回購

git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 \                  (release-branch|✔) 17:49:31 
    -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc "[email protected]" 

this answer for more information提交。我懷疑你的問題源於git reflog本身保持對不可達提交的引用(從而使它們「可到達」)

相關問題