我应该为每个工作目录运行'git gc'吗?

时间:2015-04-28 03:05:09

标签: git garbage-collection

我有时会运行git gc来清理文件并提高性能,通常使用cronjob。但是,我还使用git-new-workdir创建一个具有自己索引的新工作目录。

在每个工作目录上运行git gc是否有意义?为什么呢?

2 个答案:

答案 0 :(得分:2)

不,这没有任何意义。运行一次。

git gc不会修改工作目录中的任何内容。 修改.git目录中的内容。 git-new-workdir的整个点是在多个工作目录之间共享一个.git,因此从两个不同的工作目录运行git gc与从同一目录运行两次相同;也就是说,这是没有意义的。

答案 1 :(得分:2)

不,因为底层存储库由所有这些单独的工作目录共享,git gc在底层存储库上运行。

这里还有一个(轻微但真实的)危险。运行git gc时,它会清除并压缩存储库对象,丢弃那些未引用的对象。在某些情况下,某些引用可能仅在索引中,或仅在HEAD中(在“分离的HEAD”模式下)。但请注意,在git-new-workdir的说明中,它部分地说:

  

它只是为你设置一个新的工作目录(有自己的索引)。

隐藏在其他索引中的引用 - 即,与work-dir不同的任何索引 - 对git gc是不可见的,使它们有资格被删除。

大部分时间这都不会成为问题,因为git gc运行git prune并且未引用对象的默认到期时间(即2周)。当您git add一个文件但没有git commit结果时,会发生仅索引引用,因此如果您保留git add未提交的git add个ed文件,这些明显过时的引用只会消失至少两周......你总是可以通过.git根据需要再次修复问题。

使用分离的HEAD创建匿名分支会出现更阴险的版本。您链接的页面没有提到它,但new-workdir脚本没有(也不能)在单独的“新工作目录”中维护这些分离的HEAD(这些新目录中的每一个都有自己的HEAD目录单独git gc参考)。如果在其他工作目录中运行function checkclick(accNo) //Call this function wherever you want and pass Account_ID { $('div.float-left span.fullaccnum').each(function(){ if(accNo==$(this).html()) { $(this).siblings('b').children('a').trigger('click') } }); } ,则可以从底层存储库中丢弃两周或多周的分离提交链。

这对于“真正的”分支和标记来说不是问题,因为脚本共享“更深层”的引用(包括分支和标记)。也就是说,更新一个work-dir中的分支X会更新所有其他工作中的分支X,这样就无法丢失引用。

总之(太晚了?:-))如果你没有超脱HEADs超过一个星期,你就相当安全。