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

Should I run 'git gc' for every working directory?

我有时 运行 git gc to clean up files and improve performance, usually with a cronjob. However, I also use git-new-workdir 创建一个有自己索引的新工作目录。

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

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

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

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

这里还有一个额外的(小但真实的)危险。当您 运行 git gc 时,它会清理并压缩存储库对象,丢弃那些未引用的对象。在某些情况下,某些引用可能仅在索引中,或仅在 HEAD 中(在 "detached HEAD" 模式中)。但请注意,在 git-new-workdir 的描述中,它部分表示:

it simply sets up a new working directory (with its own index) for you.

隐藏在其他一些索引中的引用——即任何不是在工作目录中看到的索引——对 git gc 是不可见的,使它们有资格被删除。

大多数时候这不会成为问题,因为 git gc 运行s git prune 具有未引用对象的默认过期时间(即 2 周)。当您 git add 一个文件但没有 git commit 结果时,会发生仅索引引用,因此这些明显过时的引用只会在您未提交 git added 文件的情况下消失至少两周...您始终可以根据需要再次 git add-ing 文件来解决问题。

一个更隐蔽的版本是使用分离的 HEAD 创建匿名分支。您链接的页面没有提到它,但是 new-workdir 脚本不会(也不能)在单独的 "new work dirs" 中维护这种分离的 HEAD(这些新目录中的每一个都有自己的 .git 目录和自己的单独 HEAD 参考)。如果 git gc 在某个其他工作目录中是 运行,则可以从基础存储库中丢弃两周或更长时间的分离提交链。

这对于 "real" 分支和标签不是问题,因为脚本共享 "deeper" 引用(包括分支和标签)。也就是说,更新一个工作目录中的分支 X 会更新所有其他工作目录中的分支 X,这样就不会丢失引用。

简而言之(为时已晚?:-))如果你不将分离的 HEADs 放在外面超过一周,你是相当安全的。