17

是否有导致git gc --auto运行的命令的明确列表?git-gc(1) 手册页简单说明:

- 汽车

使用此选项, git gc 会检查是否需要进行任何内务处理;如果没有,它会退出而不执行任何工作。一些 git 命令git gc --auto在执行可能创建许多松散对象的操作后运行。

(重点补充)

我正在组织从 SVN 到 Git 的大规模迁移。绝大多数用户将使用 Windows PC,其中相当一部分是非技术用户。他们将使用 TortoiseGit(因为它与他们已经熟悉的 TortoiseSVN 非常匹配)——我注意到 TortoiseGit 根本不包含任何git gc手动运行的功能。

不能指望非技术人员必须启动“git bash”命令行才能git gc --auto从适当的工作目录运行;并且当我们使用 MsysGit 的“便携式”发行版时,它们将没有“Git GUI Here..”windows shell 上下文菜单快捷方式。

期望随着时间的推移 Git 将主要自我维护是否合理,或者我是否需要尝试制定一种非技术用户友好的调用方法git gc --auto

4

2 回答 2

5
builtin/merge.c:            const char *argv_gc_auto[] = { "gc", "--auto", NULL };
builtin/receive-pack.c:     "gc", "--auto", "--quiet", NULL,
git-am.sh:                  git gc --auto
git-rebase--interactive.sh: git gc --auto &&
git-svn.perl:               command_noisy('gc', '--auto');

git grep -- --autogit.git 上,这些结果看起来很有趣。值得注意的builtin/merge.cgit pull事件应该触发git gc --auto.

此外,除非您的“非技术”员工正在做相当“高级”的工作(此时他们将不再是“非技术”),我不明白他们为什么需要git gc手动运行而不是仅仅让git gc --auto处理一切。

于 2011-02-28T02:07:18.860 回答
2

使用 Git 2.17(2018 年第二季度),您必须添加git commit到触发git gc --auto.
实际上,从 Git 开始就应该如此。

请参阅Ævar Arnfjörð Bjarmason ( ) 的提交 095c741(2018 年 2 月 28 日(由Junio C Hamano 合并——提交 9bb8eb0中,2018 年 3 月 8 日)avar
gitster

commit:在钩子git gc --auto之前运行post-commit

d4bb43e中的行为更改git-commit回 它 在.git gc --autocommitmergeamrebasegit-commit.sh

不久之后,在f5bbc32(“Port git committo C.”,2007-11-08,Git v1.5.4-rc0)中,当它被移植到 C 时,“ git gc --auto”调用消失了。

由于那次意外回归,git gc --auto只运行了git-am, git-merge,git-fetchgit-receive-pack.
可以编写一个脚本来“ git commit”在本地存储大量数据,并且gc永远不会运行。

在将每日 cronjob 添加到“”之前,一个在本地提交生成的区域文件更改的此类存储库已增长到约 60GB 的大小git gc,使其降至不到 1GB。这将使此类案例无需干预即可工作。

我认为修复这种存储库将永远增长的病态情况是一个值得的权衡,因为它花费了几毫秒调用“ git gc --auto”(在它不做任何事情的常见情况下)。


您可以使用 Git 2.27(2020 年第二季度)找到此列表的另一个说明,它教“ am”、“ commit”、“ merge”和“ rebase”,当它们使用“ --quiet”选项运行时,将“”传递--quiet给“ gc --auto”。

请参阅Junio C Hamano ( ) 的提交 7c3e9e8提交 850b6ed(2020 年 5 月 6 日(由Junio C Hamano 合并 -- --提交 3af459e中,2020 年 5 月 13 日)gitster
gitster

auto-gcgit fetch: 从“ ”中提取一个可重用的助手

审核人:Taylor Blau

早在1991006c ( fetch: convert argv_gc_autoto struct argv_array, 2014-08-16, Git v2.1.1 ) 中,我们教过 " git fetch --quiet" 将 " --quiet" 选项传递给 " gc --auto"。

但是,此问题不仅限于“获取”:

$ git grep -e 'gc.*--auto' \*.c

am在“ ”、“ commit”、“ merge”和“ ”中找到命中,并且这些命令在它们自己被告知要安静时rebase不会传递“ --quiet”到“ ”。gc --auto

作为准备步骤,让我们引入一个辅助函数run_auto_gc(),调用者可以传递一个布尔值“ quiet”,并使用该辅助函数重做“”的修复git fetch

于 2018-03-11T03:56:30.833 回答