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

xwbd5t1u  于 2023-11-15  发布在  Git
关注(0)|答案(5)|浏览(190)

我的rails项目目录中的 *.git/objects * 在删除了数百MB意外生成的垃圾后仍然很大。
我尝试了git add -A,以及其他命令来更新索引和删除不存在的文件。我推测,也许是错误的,目录中有两个字符名称的文件是blob。我尝试回滚到以前的提交,但没有运气。
我可以做些什么来清理这个目录?

yeotifhr

yeotifhr1#

  • 如果您添加了文件然后又删除了它们,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

字符串

  • 另一种方法是克隆仓库,因为这只会携带可访问的对象。但是,如果悬挂对象被打包(如果你执行了很多操作,git可能会自动打包),那么本地克隆将携带整个packfile:
git clone foo bar                 # bad
git clone --no-hardlinks foo bar  # also bad


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

git clone file://foo bar  # good

pobjuy32

pobjuy323#

Sparkleshare在我的git中创建了13 GB的tmp_pack_ files,因为无法拉取多次巨大的二进制文件。'git gc'没有删除这些文件。唯一有帮助的是.

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

字符串
rm -f很危险!有备份。你可以在以下情况下测试:

find .git -name "tmp_*" -print


不知道这么多年过去了这是否仍然是一个问题,但是如果你不知道你在做什么,不确定操作系统或git版本(这告诉你不知道这是unix shell的globbing),就不要使用这个。https://en.wikipedia.org/wiki/Glob_(programming)

ycl3bljg

ycl3bljg4#

如果你在修剪和重新打包后仍然有一个大的repo(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-分支从你的仓库中删除罪魁祸首。
有关指导,请参见http://progit.org/book/ch9-7.html中的“删除对象

qq24tv8q

qq24tv8q5#

递归:

find ./ -iname '*.!*' -size 0 -delete
for i in */.git; do ( echo $i; cd $i/..; git gc --aggressive --prune=now --force; ); done

字符串

相关问题