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

lig*_*lbs 72 git

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

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

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

Jos*_*Lee 117

  • 如果您添加了文件然后将其删除,则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
    
    Run Code Online (Sandbox Code Playgroud)
  • 另一种方法是克隆存储库,因为它只携带可访问的对象.但是,如果悬空对象被打包(如果你执行了很多操作,git可能已经自动打包),那么本地克隆将携带整个packfile:

    git clone foo bar                 # bad
    git clone --no-hardlinks foo bar  # also bad
    
    Run Code Online (Sandbox Code Playgroud)

    您必须指定一个协议来强制git计算新包:

    git clone file://foo bar  # good
    
    Run Code Online (Sandbox Code Playgroud)

  • 抱歉,没有效果。我的开发主管说大小现在在可接受但不利的范围内。如果你有时间继续用勺子喂我,那就太好了,但你已经让我重新站起来了。谢谢 jleedev。 (2认同)

rya*_*ogo 27

你试过这个git gc命令吗?

  • `git gc --aggressive --prune` 对我有用。`git gc` 没有。也许默认设置还不够。 (6认同)
  • 默认情况下 [`--prune`](https://git-scm.com/docs/git-gc#Documentation/git-gc.txt---pruneltdategt) 删除超过 2 周的悬挂对象。您可以传递“--prune=now”,但是如果另一个进程同时写入存储库,则您将面临损坏存储库的风险。 (2认同)

cat*_*cat 11

Sparkleshare在我的git中创建了13GB的tmp_pack_文件,因为它无法多次进行大量图像检查.唯一有帮助的是......

rm -f .git/objects/*/tmp_*
Run Code Online (Sandbox Code Playgroud)

'git gc'没有删除这些文件.

  • 绝望的情况需要绝望的措施,它就像一个魅力!Tks。 (2认同)
  • rm 是 Linux 命令吗?那么Windows用户@cat呢? (2认同)

seh*_*ehe 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
Run Code Online (Sandbox Code Playgroud)

这将为您提供按升序大小排序的对象列表.您可以使用git-filter-branch从您的仓库中删除罪魁祸首.

有关指导,请参阅http://progit.org/book/ch9-7.html中的 "删除对象"