我怎样才能清理我的.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仓库中的文件和文件夹