我的rails项目目录中的 .git / objects 在删除数百兆字节的意外生成的垃圾后仍然庞大。
我已尝试git add -A
以及其他命令来更新索引并删除不存在的文件。我收集,也许是错误的,目录中有两个字符名称的文件是blob。我曾尝试回滚以前的提交,但没有运气。
我该怎么做才能清理这个目录?
答案 0 :(得分:109)
如果您添加了文件然后将其删除,则blob仍然存在但是悬空。 git fsck
会列出无法访问的blob,git prune
会删除它们。
如果您添加了文件,提交了文件,然后使用git reset --hard HEAD^
回滚,那么它们会更加深入。 git fsck
将不会列出任何悬空提交或blob,因为您的分支reflog正在抓住它们。这是确保只保留历史记录中的对象的一种方法:
git reflog expire --expire=now --all
git repack -ad # Remove dangling objects from packfiles
git prune # Remove dangling loose objects
另一种方法是克隆存储库,因为它只会携带可访问的对象。但是,如果悬空对象被打包(如果你执行了很多操作,git可能已经自动打包),那么本地克隆将携带整个packfile:
git clone foo bar # bad
git clone --no-hardlinks foo bar # also bad
您必须指定一个协议来强制git计算新包:
git clone file://foo bar # good
答案 1 :(得分:23)
您是否尝试过git gc
命令?
答案 2 :(得分:11)
Sparkleshare在我的git中创建了13GB的tmp_pack_文件,因为它无法多次进行大量图像检查。唯一有帮助的是......
rm -f .git/objects/*/tmp_*
' git gc'没有删除那些文件。
答案 3 :(得分:7)
如果你在修剪和重新包装后仍然有一个大的回购(gc --aggressive --prune=tomorrow
...)那么你可以简单地去寻找奇怪的回购:
git rev-list --objects --all |
while read sha1 fname
do
echo -e "$(git cat-file -s $sha1)\t$\t$fname"
done | sort -n
这将为您提供按升序大小排序的对象列表。您可以使用git-filter-branch从您的仓库中删除罪魁祸首。
请参阅http://progit.org/book/ch9-7.html中的“删除对象”以获取指导
答案 4 :(得分:1)
递归:
const configstrp = require('./config/configstrp.js');
const ngrok = configstrp.ngrok.enabled ? require('ngrok') : null;