为什么git在每次合并时运行"git gc --auto"?

Mik*_*ron 16 git

今天,git开始表现得很有趣(好吧,比平时更有趣),坚持git gc每次合并后都要跑,即使他们是背靠背.

C:\Projects\my-current-project>git pull
remote: Counting objects: 31, done.
remote: Compressing objects: 100% (16/16), done.
remote: Total 16 (delta 11), reused 0 (delta 0)
Unpacking objects: 100% (16/16), done.
From git.company.com:git/
   e992ce8..6376211  mybranch/next -> origin/mybranch/next
Merge made by recursive.
Auto packing the repository for optimum performance. You may also run "git gc" manually. See "git help gc" for more information.
FIND: Parameter format not correct
Counting objects: 252732, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (59791/59791), done.
Writing objects: 100% (252732/252732), done.
Total 252732 (delta 190251), reused 252678 (delta 190222)
Removing duplicate objects: 100% (256/256), done.
 .../stylesheets/style.css                          |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
Run Code Online (Sandbox Code Playgroud)

这是非常具有破坏性的,我担心这意味着我的存储库以某种方式损坏(这是我第一次自动看到它gc).我的恐惧没有根据吗?如果我的存储库没问题,我如何让自动包装停止?!

seh*_*ehe 14

编辑

我想我发现了这个问题.

你可能在Windows上运行Cygwin/git或MsysGit.我注意到了因为

FIND: Parameter format not correct
Run Code Online (Sandbox Code Playgroud)

错误信息.麻烦的是你的钩子脚本(或git内部?!)正在调用find,它找不到UNIX(GNU)查找实用程序,而是找到Windows(MSDOS ...原文如此)FIND.EXE.

您应该能够修复系统范围的路径.如果这不是一个选项,请在脚本中明确指定PATH环境变量(或在调用它们之前)


旧答案的信息:

git gc --auto并不总是导致采取任何行动; 你确定每次都花时间,或者你刚刚注意到它正在被召唤?

如果每次调用它,你可能会

  • 检查存储库权限(确保它完全可写给你!)
  • git fsck
  • git重新包装
  • git bundle --create mybundle.git --all并且git clone mybundle.git看看你是否可以"撼动"罪魁祸首
  • 看看你是否可以升级到更高版本
  • 如果所有其他方法都失败了,请调试或调试git-gc二进制文件

可选地,当你动摇了罪魁祸首时,你可以分析你的'清洁'回购和当前回购之间的不同之处.

git-gc手册页:

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

如果存储库中有太多松散的对象或太多的包,则需要内务处理.如果松散对象的数量超过gc.auto配置变量的值,则使用git repack -d -l将所有松散对象合并为单个包.将gc.auto的值设置为0将禁用松散对象的自动打包.

如果包的数量超过gc.autopacklimit的值,则使用git repack的-A选项将现有包(标记为.keep文件的包除外)合并到单个包中.将gc.autopacklimit设置为0将禁用包的自动合并.

  • 似乎完整的git gc修复了它。我想是发生了什么事情,导致我的存储库中出现大量垃圾,从而使其远远超过了“需要gc”阈值,甚至超过了“在一个自动gc中要做多少”阈值。该事件是什么,我只能猜测(因为有6个人定期写此回购报告),但现在已停止,因此实际上可以完成工作。我将根据`FIND`建议接受此答案,同时使我想到运行完整的gc。 (2认同)

Dav*_*uth 9

我正在添加这个答案,即使它没有回答原始海报的具体问题,因为每次我的一个回购开始自动打包后,我忘记了修复,再次搜索它并首先找到这个问题.

当我的一个repos在每次合并后开始"自动打包存储库以获得最佳性能"时,

git gc --prune=now
Run Code Online (Sandbox Code Playgroud)

解决它.(在Mac上,我没有FIND: Parameter format not correct问题.)现在我正在使用git 2.4.1,但这对我来说有几个2.*版本.

这个答案如何从我的混帐回购协议中删除未引用斑点表明,一个可能需要一个明确的引用日志与

git reflog expire --expire-unreachable=now --all
Run Code Online (Sandbox Code Playgroud)

为了使上述命令最有效,但我从来不需要这样做来在每次合并后修复自动打包.


Ste*_*all 5

您正在使用什么版本的git?无论如何,我发现自动gcing极具破坏性。

git config --global gc.auto 0

  • 这不是一个好主意。它会自动发生,因为没有人会记得要手动运行它,从而导致git在仓库中随着时间的推移而降低速度,并增加了文件系统的使用率。在正常情况下,这种情况很少发生,因此不应该具有破坏性。如果在执行其他操作时发生这种情况,只需在终端中打开一个新选项卡,然后从那里继续。 (7认同)
  • 避免中断的正确解决方案是不禁用auto-gc(出于上述其他人提到的原因)。而是使用以下内容创建一个pre-auto-gc钩子:`echo“ Git认为是时候运行git gc了。” 退出1`这样,您会及时得到提醒,并且仅在适合您的时间运行git gc,而不是随机运行。 (2认同)