我怎样才能清理我的.git文件夹? 清理了我的项目目录,但.git仍然很大

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

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

我能做些什么来清理这个目录?

  • 如果您添加了文件,然后删除它们,斑点仍然存在,但悬而未决。 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 

你有没有试过git gc命令?

Sparkleshare在我的git中创build了13GB的tmp_pack_文件,因为无法将多次巨大的映像签入。 唯一有帮助的是…

 rm -f .git/objects/*/tmp_* 

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

如果修剪和重新包装( 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 

这会给你一个升序大小的对象的sorting列表。 你可以使用git-filter-branch从你的repo中删除罪魁祸首。

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

这是我用来实际删除文件的命令(我用sehe的答案来查找罪魁祸首):

 git filter-branch --tree-filter 'rm -rf path/to/folder' HEAD 

如果你只需要删除一个文件,你可以这样做:

 git filter-branch --tree-filter 'rm filename' HEAD 

来源: 永久删除git仓库中的文件和文件夹