在某个地方,一些巨大的文件被添加到我拥有的项目的git存储库中。当我在一台新机器上克隆这个项目时,该项目似乎在37%的时间内被“卡住”了一段时间。这个项目应该在几分钟内克隆。
如何找出造成这个漫长克隆时间的对象?
我知道如何“git rm”文件。是否会删除它,即使它只是历史中存在的一些旧对象?
我不是很清楚,一旦你“git rm”一个文件,它是从存储库中删除完全,还是只是继续。
非常感谢任何帮助!
答案 0 :(得分:5)
Pro Git有一个很好的,一步一步的explanation如何做到这一点。这需要一些工作,但可以可靠地完成。我不能赞成以下解释 - 我只是从该网站窃取它(有关更详细的说明,请参阅原始网站):
打包回购邮件:
$ git gc
查找git数据库中最大的项目。以下命令将列出三个最大的一个,最大的一个是输出的最后一行(下面的示例包括您要键入的命令以及示例输出):
# In the following command, replace the pack*.idx filename
# with whatever filename you find in the .git/objects/pack
# directory:
$ git verify-pack -v .git/objects/pack/pack-3f8c0...bb.idx | sort -k 3 -n | tail -3
e3f094f522629ae358806b17daf78246c27c007b blob 1486 734 4667
05408d195263d853f09dca71d55116663690c27c blob 12908 3478 1189
7a9eb2fba2b1811321254ac360970fc169ba2330 blob 2056716 2056872 5401
询问哪个文件名与最大的blob相关联:
$ git rev-list --objects --all | grep 7a9eb2fb
7a9eb2fba2b1811321254ac360970fc169ba2330 git.tbz2
获取该文件的历史记录:
$ git log --pretty=oneline -- git.tbz2
da3f30d019005479c99eb4c3406225613985a1db oops - removed large tarball
6df764092f3e7c8f5f94cbe08ee5cf42e92a0289 added git tarball
使用git filter-branch
删除对该文件的所有引用:
$ git filter-branch --index-filter \
'git rm --cached --ignore-unmatch git.tbz2' -- 6df7640^..
Rewrite 6df764092f3e7c8f5f94cbe08ee5cf42e92a0289 (1/2)rm 'git.tbz2'
Rewrite da3f30d019005479c99eb4c3406225613985a1db (2/2)
Ref 'refs/heads/master' was rewritten
清理对此blob的一些剩余引用,然后再次gc
重新打包:
$ rm -Rf .git/refs/original
$ rm -Rf .git/logs/
$ git gc
Counting objects: 19, done.
Delta compression using 2 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (19/19), done.
Total 19 (delta 3), reused 16 (delta 1)
答案 1 :(得分:2)
您可以通过以下命令遍历提交树:
git ls-tree <first-commit-hash> -r --long > 1.txt
然后grep生成的文件大于10Mb的blob。
答案 2 :(得分:1)
find / -size +10M -ls
这会发现大于10MiB的文件(不完全是10MB)。
这是一个很好的解释,可以帮助你一点。
Github有a nice writeup关于从存储库的所有已提交版本中删除特定文件的信息。