git gc:设备上没有剩余空间,即使3GB可用且tmp_pack只有16MB

Mic*_*ler 12 linux git

> git gc --aggressive --prune=now
Counting objects: 68752, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (66685/66685), done.
fatal: sha1 file '.git/objects/pack/tmp_pack_cO6T53' write error: No space left on device
Run Code Online (Sandbox Code Playgroud)

叹了口气,好的

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        19G   15G  3.0G  84% /
udev            485M  4.0K  485M   1% /dev
tmpfs            99M  296K   99M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            494M     0  494M   0% /run/shm
cgroup          494M     0  494M   0% /sys/fs/cgroup
Run Code Online (Sandbox Code Playgroud)

看起来并不那么糟糕

ls -lh .git/objects/pack/
total 580M
-r--r--r-- 1 foouser root  12K Oct 30 05:47 pack-0301f67f3b080de7eb0139b982fa732338c49064.idx
-r--r--r-- 1 foouser root 5.1M Oct 30 05:47 pack-0301f67f3b080de7eb0139b982fa732338c49064.pack
-r--r--r-- 1 foouser root 5.1K Oct 14 10:51 pack-27da727e362bcf2493ac01326a8c93f96517a488.idx
-r--r--r-- 1 foouser root 100K Oct 14 10:51 pack-27da727e362bcf2493ac01326a8c93f96517a488.pack
-r--r--r-- 1 foouser root  11K Oct 25 10:35 pack-4dce80846752e6d813fc9eb0a0385cf6ce106d9b.idx
-r--r--r-- 1 foouser root 2.6M Oct 25 10:35 pack-4dce80846752e6d813fc9eb0a0385cf6ce106d9b.pack
-r--r--r-- 1 foouser root 1.6M Apr  3  2014 pack-4dcef34b411c8159e3f5a975d6fcac009a411850.idx
-r--r--r-- 1 foouser root 290M Apr  3  2014 pack-4dcef34b411c8159e3f5a975d6fcac009a411850.pack
-r--r--r-- 1 foouser root  40K Oct 26 11:53 pack-87529eb2c9e58e0f3ca0be00e644ec5ba5250973.idx
-r--r--r-- 1 foouser root 6.1M Oct 26 11:53 pack-87529eb2c9e58e0f3ca0be00e644ec5ba5250973.pack
-r--r--r-- 1 foouser root 1.6M Apr 19  2014 pack-9d5ab71d6787ba2671c807790890d96f03926b84.idx
-r--r--r-- 1 foouser root 102M Apr 19  2014 pack-9d5ab71d6787ba2671c807790890d96f03926b84.pack
-r--r--r-- 1 foouser root 1.6M Oct  3 10:12 pack-af6562bdbbf444103930830a13c11908dbb599a8.idx
-r--r--r-- 1 foouser root 151M Oct  3 10:12 pack-af6562bdbbf444103930830a13c11908dbb599a8.pack
-r--r--r-- 1 foouser root 4.7K Oct 20 11:02 pack-c0830d7a0343dd484286b65d380b6ae5053ec685.idx
-r--r--r-- 1 foouser root 125K Oct 20 11:02 pack-c0830d7a0343dd484286b65d380b6ae5053ec685.pack
-r--r--r-- 1 foouser root 6.2K Oct  2 15:38 pack-c20278ebc16273d24880354af3e395929728481a.idx
-r--r--r-- 1 foouser root 4.2M Oct  2 15:38 pack-c20278ebc16273d24880354af3e395929728481a.pack
-r--r--r-- 1 root          root  16M Feb 27 08:19 tmp_pack_cO6T53
Run Code Online (Sandbox Code Playgroud)

因此,git gc在一个只有16MB大的tmp包上挽救,而我的磁盘似乎有3GB空闲.我错过了什么?我怎样才能git gc更可靠地工作?我试过没有激进的选择,--prune而不是--prune=now同样的故事.

更新

在重新打包操作期间执行df -h表明它现在正在使用我的所有磁盘(100%使用率).不久之后,重新包装操作失败,它在.git/objects/pack /文件夹中留下了另外14MB的文件.所以,回顾一下,我的包总共使用了580MB.git repack以某种方式设法使用3GB来重新打包.顺便说一下,我在RAM中有大约800MB的空闲时间. - 也许它正在使用如此多的工作内存以至于堵塞掉掉了?我想我的问题归结为:有没有选择让git重新包装更少资源饥饿?

版本:Ubuntu 12.04上的git版本1.7.9.5

更新2 我已将git更新为2.3.不幸的是没有改变任何东西.

> git --version
git version 2.3.0
> git repack -Ad && git prune
Counting objects: 68752, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (36893/36893), done.
fatal: sha1 file '.git/objects/pack/tmp_pack_N9jyVJ' write error: No space left on device
Run Code Online (Sandbox Code Playgroud)

更新3

好吧,所以我只注意到一些奇怪的东西:该.git目录实际上使用的磁盘空间比之前报道的508MB多.

> du -h -d 1 ./.git
8.0K    ./.git/info
40K ./.git/hooks
24M ./.git/modules
28K ./.git/refs
4.0K    ./.git/branches
140K    ./.git/logs
5.0G    ./.git/objects
5.0G    ./.git
Run Code Online (Sandbox Code Playgroud)

进一步检查.git/objects/pack实际使用4.5GB.差异在于我之前没有注意到的隐藏临时文件:

ls -lha ./.git/objects/pack/
total 4.5G
drwxr-xr-x   2 foouser root  56K Feb 27 15:40 .
drwxr-xr-x 260 foouser root 4.0K Oct 26 14:24 ..
-r--r--r--   1 foouser root  12K Oct 30 05:47 pack-0301f67f3b080de7eb0139b982fa732338c49064.idx
-r--r--r--   1 foouser root 5.1M Oct 30 05:47 pack-0301f67f3b080de7eb0139b982fa732338c49064.pack
-r--r--r--   1 foouser root 5.1K Oct 14 10:51 pack-27da727e362bcf2493ac01326a8c93f96517a488.idx
-r--r--r--   1 foouser root 100K Oct 14 10:51 pack-27da727e362bcf2493ac01326a8c93f96517a488.pack
-r--r--r--   1 foouser root  11K Oct 25 10:35 pack-4dce80846752e6d813fc9eb0a0385cf6ce106d9b.idx
-r--r--r--   1 foouser root 2.6M Oct 25 10:35 pack-4dce80846752e6d813fc9eb0a0385cf6ce106d9b.pack
-r--r--r--   1 foouser root 1.6M Apr  3  2014 pack-4dcef34b411c8159e3f5a975d6fcac009a411850.idx
-r--r--r--   1 foouser root 290M Apr  3  2014 pack-4dcef34b411c8159e3f5a975d6fcac009a411850.pack
-r--r--r--   1 foouser root  40K Oct 26 11:53 pack-87529eb2c9e58e0f3ca0be00e644ec5ba5250973.idx
-r--r--r--   1 foouser root 6.1M Oct 26 11:53 pack-87529eb2c9e58e0f3ca0be00e644ec5ba5250973.pack
-r--r--r--   1 foouser root 1.6M Apr 19  2014 pack-9d5ab71d6787ba2671c807790890d96f03926b84.idx
-r--r--r--   1 foouser root 102M Apr 19  2014 pack-9d5ab71d6787ba2671c807790890d96f03926b84.pack
-r--r--r--   1 foouser root 1.6M Oct  3 10:12 pack-af6562bdbbf444103930830a13c11908dbb599a8.idx
-r--r--r--   1 foouser root 151M Oct  3 10:12 pack-af6562bdbbf444103930830a13c11908dbb599a8.pack
-r--r--r--   1 foouser root 4.7K Oct 20 11:02 pack-c0830d7a0343dd484286b65d380b6ae5053ec685.idx
-r--r--r--   1 foouser root 125K Oct 20 11:02 pack-c0830d7a0343dd484286b65d380b6ae5053ec685.pack
-r--r--r--   1 foouser root 6.2K Oct  2 15:38 pack-c20278ebc16273d24880354af3e395929728481a.idx
-r--r--r--   1 foouser root 4.2M Oct  2 15:38 pack-c20278ebc16273d24880354af3e395929728481a.pack
-r--r--r--   1 root          root 1.1K Feb 27 15:37 .tmp-7729-pack-00447364da9dfe647c89bb7797c48c79589a4e44.idx
-r--r--r--   1 root          root  14M Feb 27 15:29 .tmp-7729-pack-00447364da9dfe647c89bb7797c48c79589a4e44.pack
-r--r--r--   1 root          root 1.1K Feb 27 15:32 .tmp-7729-pack-020efaa9c7caf8b792081f89b27361093f00c2db.idx
-r--r--r--   1 root          root  41M Feb 27 15:30 .tmp-7729-pack-020efaa9c7caf8b792081f89b27361093f00c2db.pack
-r--r--r--   1 root          root 1.1K Feb 27 15:37 .tmp-7729-pack-051980133b8f0052b66dce418b4d3899de0d1342.idx
(continuing for a *long* while). 
Run Code Online (Sandbox Code Playgroud)

现在我想知道:删除那些是否安全?

The*_*son 7

类似的情况(大约有 2.3G 可用),但git gc它本身也会失败fatal: Unable to create '/home/ubuntu/my-app-here/.git/gc.pid.lock': No space left on device

有效的方法是git prune首先运行 gc。


Mic*_*ler 5

因此,这是到目前为止我发现的内容:在.git/objects/pack文件夹中找不到有关这些隐藏的“ .tmp-XXXX-pack”的任何文档。我可以找到的所有其他线程都是关于同一文件夹中带有前缀的非隐藏文件tmp_。在重新打包操作期间,显然也会创建隐藏的对象,并且这些对象也有可能卡住。我无法确认在git 2.3.0中是否仍然可行(我已更新至此版本),但至少在此较新版本中磁盘空间要求似乎没有改变-它仍然无法完成gc /重新包装。通过删除这些.tmp文件,我能够恢复到我的最后4GB,之后git仍然表现良好-尽管您的结果可能有所不同,所以在执行此操作之前请确保已备份。最后,即使4GB也不足以重新打包gc --agressive.git清理后,我的文件夹为1.1GB,整个存储库为1.7GB。因此git gc,即使使用激进的选项(应该可以节省空间),存储库大小的2倍可能还是不够的。因此,我必须首先从其他地方恢复更多的空间。

最后,这是我现在的清理脚本中的内容(我认为从cron作业中调用它可能是一个好主意):

#!/bin/bash
set -e

#git gc or remove tmp if that fails (because out of disk space)
git gc --aggressive --prune=now || rm -f .git/objects/*/tmp_* && rm -f .git/objects/*/.tmp-*
Run Code Online (Sandbox Code Playgroud)

  • 有趣的反馈,+。但是我确认仅使用`git gc`是不够的。如http://stackoverflow.com/a/28563637/6309中所述,还需要git repack -Ad和git prune。 (2认同)

小智 2

我遇到过这个问题的例子。我能够释放大量磁盘空间,但是当然,这并没有解决如何处理 .tmp-* 文件的问题。我运行了git fsck,Git 存储库没有以这种方式损坏。

我进行了传统的打包和垃圾收集操作

git repack -Ad
git prune
Run Code Online (Sandbox Code Playgroud)

但这并没有删除 .tmp-* 文件,尽管它可以确保所有必要的对象都在标准 pack-* 文件中,如果它们需要从崩溃的 Git 进程留下的临时文件中复制的话。过去的。

最终我意识到我可以安全地将 .tmp-* 文件移动到临时目录,然后运行git fsck以查看 .git 目录中剩余的内容是否完整。事实证明确实如此,所以我删除了scratch目录及其包含的文件。如果git fsck报告了问题,我可以将 .tmp-* 文件移回 .git 目录并研究另一个解决方案。