【问题标题】:Why does git run auto-packing on every push to our repo?为什么 git 在每次推送到我们的仓库时都会自动打包?
【发布时间】:2013-07-29 07:51:50
【问题描述】:

最近几天,每次推送到我们的 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 的服务器上。

【问题讨论】:

标签: git


【解决方案1】:

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

  1. 包太多了吗? (从字面上看,.git/objects/pack 中有 more than 50 files.idx 吗?)
  2. 是否有太多松散的对象? (字面意思,有more than 27 files in .git/objects/17吗?)

如果由于某种原因 Git 无法合并打包文件或删除该目录中的松散对象,它会认为下次需要再次自动 gc。

我会检查上面引用的两个目录的内容,看看是否满足(默认)条件,看看重新打包后条件是否改变。

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

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

当然,您还应该通过查看以下内容来确保与 gc 相关的可调参数没有被不合理地设置:

git config -l | grep gc

有关其他详细信息,请参阅 Git Internals 上的 Git SCM 书籍。

【讨论】:

  • 没有松散的对象,但是有 346 个包...没有设置 gc 选项,但是由于 4GB 内存的小服务器,我们设置了 pack.windowmemory=50m 和 pack.packsizelimit =100米。我们有一个庞大的 repo,因为我们在开始使用 git 时犯了添加大二进制文件的错误。
  • “不合理的调整参数”确实是问题所在。我将 pack.packsizelimit 增加到 500m,重新打包后,我在 objects/pack 中有 27 个 .idx 文件,并且 repo 运行良好。感谢您的帮助。
  • packSizeLimit 对我来说设置为 10m。将其更改为 2g 解决了此问题。谢谢。
  • 对于任何有太多松散物体的人:使用git gc --prune=3days 删除超过 3 天的所有内容。 (否则默认为 2 周。)
猜你喜欢
  • 2010-11-25
  • 2023-04-10
  • 2012-07-09
  • 2016-07-05
  • 1970-01-01
  • 2012-11-14
  • 2011-09-03
  • 2016-06-15
  • 1970-01-01
相关资源
最近更新 更多