在删除了数百兆的意外生成的垃圾之后,我的rails项目目录中的.git / objects仍然很大。
我已经尝试过git add -A,以及其他命令来更新索引并删除不存在的文件。我可能不正确地收集到目录中具有两个字符名称的文件是blob。我尝试回滚到以前的提交,但是没有运气。
我该怎么清理这个目录?
Answers:
如果您添加了文件然后将其删除,则斑点仍然存在,但会悬空。git fsck将列出无法访问的Blob,git prune并将其删除。
如果您添加了文件,提交了文件,然后使用进行了回滚git reset --hard HEAD^,则文件会更深一些。git fsck不会列出任何悬空的提交或Blob,因为分支的引用日志会保留它们。这是确保仅保留您历史上适当的对象的一种方法:
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
file://fooURL是相对于当前目录的,并且file:///home/me/foo(三个斜杠)是绝对的。
在多次拉回大量图片后,Sparkleshare在我的git中创建了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
这将为您提供按升序排列的对象排序列表。您可以使用git-filter-branch从仓库中删除罪魁祸首。
有关指导,请参见http://progit.org/book/ch9-7.html中的“删除对象”
--aggressive。试图编辑,但事实证明您不能编辑这么小的错字。
递归地:
find ./ -iname '*.!*' -size 0 -delete
for i in */.git; do ( echo $i; cd $i/..; git gc --aggressive --prune=now --force; ); done