为什么git会在每次推送回购时自动打包?

时间:2013-07-29 13:32:53

标签: git

最近几天,每次推送到我们的git存储库都导致了服务器上的自动打包。

发生这种情况时客户端上的输出:

~pdr git:master ❯❯❯ git push origin master
Counting objects: 44, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (26/26), done.
Writing objects: 100% (27/27), 4.67 KiB, done.
Total 27 (delta 14), reused 0 (delta 0)
Auto packing the repository for optimum performance.

打包发生在服务器上,ps在工作时显示这些git命令:

git      23252  0.0  0.0  68520   552 ?        S    15:21   0:00 sshd: git@notty  
git      23253  0.0  0.0   9660   540 ?        Ss   15:21   0:00 git shell -c git-receive-pack 'repositories/pdr.git'
git      23254  0.0  0.0  16644  2136 ?        S    15:21   0:00 git receive-pack repositories/pdr.git
git      23258  0.0  0.0   9660   624 ?        S    15:21   0:00 git gc --auto --quiet
git      23261  0.0  0.0   9660   504 ?        S    15:21   0:00 git repack -d -l -q -A
git      23262  0.0  0.0   4104   376 ?        S    15:21   0:00 /bin/sh /usr/lib/git-core/git-repack -d -l -q -A
git      23275  267 92.2 9569724 3742468 ?     Sl   15:21  23:07 git pack-objects --keep-true-parents --honor-pack-keep --non-empty --all --reflog --unpack-unreachable --local -q --delta-base-offset /home/git/repositories/pdr.git/objects/.tmp-23262-pack

我在服务器上运行了一个手册“git gc”,然后是“git fsck”。没有错误消息,但在下一次推送时它再次开始自动打包。

这是在使用Git 1.7.0.4运行Ubuntu Server 10.04 LTS的服务器上。

1 个答案:

答案 0 :(得分:24)

Git决定是否自动gc based on two criteria

  1. 包装太多了吗? (从字面上看,.idx中的.git/objects/packmore than 50 files吗?
  2. 是否有太多松散的物体? (从字面上看,有more than 27 files in .git/objects/17吗?)
  3. 如果由于某种原因Git无法合并包文件或删除该目录中的松散对象,它会认为下次需要再次自动gc。

    我会查看上面引用的两个目录的内容,看看是否符合(默认)标准,看看重新打包后标准是否有所改变。

    未能完成该过程的一些原因可能是:

    • 某种权限问题
    • 无法访问的对象被Git的垃圾收集忽略或者由于年轻而默认不被修剪
    • 磁盘空间不足,无法完成gc(重新包装)
    • 内存不足以完成gc(重新包装)
    • 对象太大而无法容纳指定的包大小(请参阅git config pack.packSizeLimit,默认为无限但可能被用户覆盖)

    当然,您还应确保通过查看以下方式未合理地设置与gc相关的可调参数:

    git config -l | grep gc
    

    有关其他一些细节,请参阅Git Internals上的Git SCM一书。