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


85

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

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

我该怎么清理这个目录?

Answers:


137
  • 如果您添加了文件然后将其删除,则斑点仍然存在,但会悬空。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
    

是的,在发现问题之前,我确实做了承诺。除了最后一条命令,我已经尝试了所有方法。当我从项目目录中运行此命令时,“警告:您似乎已克隆了一个空的存储库。” 我一直在阅读文档,但这很繁琐。如何将克隆指向正确的来源?
light24bulbs 2011年

1
@user file://fooURL是相对于当前目录的,并且file:///home/me/foo(三个斜杠)是绝对的。
Josh Lee

谢谢!大小减少了一半,但是我的包仍然是其余存储库大小的十倍。我试着修剪..
light24bulbs

1
@user如果很多提交错误地拥有大文件,那么您可能想要使用git-filter-branch来选择它们。
Josh Lee

2
对不起,没有效果。我的开发负责人说,大小现在在可接受但不利的范围内。如果您有时间让汤匙喂我,那将是极好的,但您已经让我重新站起来。感谢jleedev。
light24bulbs 2011年


13

在多次拉回大量图片后,Sparkleshare在我的git中创建了13GB的tmp_pack_文件。唯一的帮助是...

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

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


这是一个蛮力的解决方案,但我认为没有理由不起作用。真好!
light24bulbs 2015年

1
绝望的情况需要绝望的措施,它就像一个魅力!Tks。
麦地那

rm是用于linux命令吗?那么Windows用户呢@cat呢?
gumuruh

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中的“删除对象”


@DavidJames感谢您的提示。IMO
2012年

以防万一其他人绊倒了:括号中的参数中有一个错字:应该是--aggressive。试图编辑,但事实证明您不能编辑这么小的错字。
hellobenallan,2015年

@hellobenallan,感谢您的来信,已修正
sehe

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.