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

时间:2011-09-12 18:22:51

标签: 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(-)

这是非常具有破坏性的,我担心这意味着我的存储库在某种程度上已经损坏(这是我第一次自动看到它gc)。我的恐惧没有根据吗?如果我的存储库没问题,我该如何使自动打包停止?!

4 个答案:

答案 0 :(得分:14)

修改

我想我发现了这个问题。

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

FIND: Parameter format not correct

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

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


旧答案:

<子>

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

如果每次调用它,您可能

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

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

来自the git-gc man-page

  

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

     

如果存储库中有太多松散的对象或太多的包,则需要内务处理。如果      松散对象的数量超过了gc.auto配置变量的值,然后是所有松散的对象      使用git repack -d -l组合成一个包。将gc.auto的值设置为0将禁用      自动包装松散物体。

     

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

答案 1 :(得分:8)

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

当我的一个回购开始时#34;自动包装存储库以获得最佳性能&#34;每次合并后,

git gc --prune=now

修复它。 (在Mac上,我不会遇到FIND: Parameter format not correct问题。)现在我使用的是git 2.4.1,但这对我有几个2. *版本。

This answerHow to remove unreferenced blobs from my git repo表示可能需要清除

git reflog expire --expire-unreachable=now --all

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

答案 2 :(得分:4)

你使用的是什么版本的git?无论如何,我发现自动gc极具破坏性。

git config --global gc.auto 0

答案 3 :(得分:2)

你的存储库应该有很多哈希从17开始的对象。 所以这会触发git gc --auto。 默认值为至少28个前缀为17的对象。