我应该为每个工作目录 运行 '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 add
ed 文件的情况下消失至少两周...您始终可以根据需要再次 git add
-ing 文件来解决问题。
一个更隐蔽的版本是使用分离的 HEAD 创建匿名分支。您链接的页面没有提到它,但是 new-workdir 脚本不会(也不能)在单独的 "new work dirs" 中维护这种分离的 HEAD(这些新目录中的每一个都有自己的 .git
目录和自己的单独 HEAD
参考)。如果 git gc
在某个其他工作目录中是 运行,则可以从基础存储库中丢弃两周或更长时间的分离提交链。
这对于 "real" 分支和标签不是问题,因为脚本共享 "deeper" 引用(包括分支和标签)。也就是说,更新一个工作目录中的分支 X 会更新所有其他工作目录中的分支 X,这样就不会丢失引用。
简而言之(为时已晚?:-))如果你不将分离的 HEADs 放在外面超过一周,你是相当安全的。
我有时 运行 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 add
ed 文件的情况下消失至少两周...您始终可以根据需要再次 git add
-ing 文件来解决问题。
一个更隐蔽的版本是使用分离的 HEAD 创建匿名分支。您链接的页面没有提到它,但是 new-workdir 脚本不会(也不能)在单独的 "new work dirs" 中维护这种分离的 HEAD(这些新目录中的每一个都有自己的 .git
目录和自己的单独 HEAD
参考)。如果 git gc
在某个其他工作目录中是 运行,则可以从基础存储库中丢弃两周或更长时间的分离提交链。
这对于 "real" 分支和标签不是问题,因为脚本共享 "deeper" 引用(包括分支和标签)。也就是说,更新一个工作目录中的分支 X 会更新所有其他工作目录中的分支 X,这样就不会丢失引用。
简而言之(为时已晚?:-))如果你不将分离的 HEADs 放在外面超过一周,你是相当安全的。