在'git pull`上自动触发`git prune`?

时间:2017-01-20 19:33:56

标签: git

在我公司范围的存储库的本地副本上(我非常经常地创建许多短期分支和git rebase,并且许多其他人也将短期分支推送到{{1我从中拉出来,我经常与git进行以下对话。

origin

```

那就是:我说(env)$ git pull remote: Counting objects: 382, done. remote: Compressing objects: 100% (247/247), done. remote: Total 382 (delta 182), reused 62 (delta 62), pack-reused 73 Receiving objects: 100% (382/382), 228.63 KiB | 0 bytes/s, done. Resolving deltas: 100% (232/232), completed with 15 local objects. From github.com:anon/anony2 aee962f..055a717 master -> origin/master [...] Auto packing the repository in background for optimum performance. See "git help gc" for manual housekeeping. error: The last gc run reported the following. Please correct the root cause and remove .git/gc.log. Automatic cleanup will not be performed until the file is removed. warning: There are too many unreachable loose objects; run 'git prune' to remove them. Updating aee962f..055a717 Fast-forward Auto packing the repository in background for optimum performance. See "git help gc" for manual housekeeping. error: The last gc run reported the following. Please correct the root cause and remove .git/gc.log. Automatic cleanup will not be performed until the file is removed. warning: There are too many unreachable loose objects; run 'git prune' to remove them. [...] 9 files changed, 128 insertions(+), 95 deletions(-) (env)$ git prune Checking connectivity: 772524, done. (env)$ rm .git/gc.log (env)$ ; git向我吐了一堆东西,有用地包括我需要运行的两个命令;我运行这些命令;然后我可以继续我的工作。

如果git只是为我运行这些命令,而不是强迫我剪切并粘贴它们,那将是非常棒的。我知道这不会是git pull的默认行为,但它似乎可能作为我可以添加到git pull的选项而存在。这样的事情存在吗?

2 个答案:

答案 0 :(得分:5)

问题很可能是你生成的松散物体足够快,实际上超出了the default git gc protection time of 2.weeks.ago

  

--prune=<date>
  修剪比日期更早的松散物体(默认为2周前,    可以通过配置变量gc.pruneExpire覆盖。 --prune =所有    修剪松散的物体,不论其年龄(不要使用    --prune = all除非你确切知道自己在做什么。除非    存储库是静止的,你将丢失新创建的对象    没有锚定裁判并最终腐蚀你的    库)。 --prune默认开启。

这里发生的事情是git gc在后​​台自动修剪松散的对象及其默认机制,即运行git prune --expire=2.weeks.ago(或者为gc.pruneExpire配置的任何内容) 。但这留下了足够松散的物体git gc认为它修剪工作很差。

运行git prune没有过期时间(如手动git prune),或--prune=all中的git gc,会删除所有松散对象。如果没有其他Git命令正在运行,这是安全的。由于git gc --auto在后​​台运行,因此需要一个安全边际 - 但是两周对于您的使用来说太多了。

如果您确信您的各种Git命令只需一周,甚至一天即可完成,则:-)您可以将gc.pruneExpire配置为1.week.ago1.day.ago让它更积极地修剪。除非你生成了大量的松散物体,否则这可能会起到作用:

$ git config gc.pruneExpire 3.days.ago

请注意,以这种方式设置时,只更改存储库的设置,并覆盖任何更多全局设置。或者:

$ git config --global gc.pruneExpire 1.week.ago

这会将您的个人(用户全局)默认值设置为一周,而不是两周(但如果已设置,则会被特定于回购的“三天”设置覆盖)。

我在检查所有这些时注意到extensions.preciousObjects没有记录。 (与所有配置变量一样,这可以拼写为任意大写和小写混合。)它是在Git 2.7.0中添加的,可以防止所有自动修剪对象,如果你想要的话您设置了一个共享存储库。 (使用起来很棘手,可能不是任何临时用户都应该设置的东西。)

答案 1 :(得分:1)

我不知道这是否是最好的,但是如果你 要输入git pull,这是完全可以理解的,你可以使用一些shelling:

  1. 查找git-pull。我在/usr/lib/git-core例如。
  2. 这是一个常规的sh脚本。添加if ( -f .git/gc.log)以检测脚本末尾的问题。您可能需要重命名为git-pull-real并创建一个简短的sh脚本来包装它,并在之后调用if
  3. if应该只修剪并删除日志 - 所以将4行顶部添加到该脚本中。
  4. 如果没有人提出内置的git解决方案,我认为这将是阻力最小的路径。