如何清理.git文件夹?清理了我的项目目录,但.git仍然庞大

时间:2011-03-11 19:33:45

标签: git

我的rails项目目录中的 .git / objects 在删除数百兆字节的意外生成的垃圾后仍然庞大。

我已尝试git add -A以及其他命令来更新索引并删除不存在的文件。我收集,也许是错误的,目录中有两个字符名称的文件是blob。我曾尝试回滚以前的提交,但没有运气。

我该怎么做才能清理这个目录?

5 个答案:

答案 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;