沿着这条线的某个地方,一些巨大的文件被添加到我拥有的项目的 git 存储库中。当我在新机器上克隆这个项目时,该项目似乎在很长一段时间内"卡"在 37% 上。这个项目应该在几分钟内克隆。
如何找出导致如此漫长的克隆时间的对象?
我知道如何"git rm"文件。这会删除它吗,即使它是一些只存在于历史记录中的旧对象?
我不太清楚,一旦你"git rm"一个文件,它是否从存储库中完全删除,或者只是继续前进。
任何帮助都非常感谢!
Pro Git 对如何做到这一点有一个很好的分步解释。 这需要一些工作,但可以可靠地完成。 我不能相信以下解释 - 我只是从那个网站上窃取它(有关更详细的描述,请参阅原始网站):
-
打包存储库:
$ 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)
您可以通过以下命令遍历提交树:
git ls-tree <first-commit-hash> -r --long > 1.txt
然后 grep 生成的文件,用于大于 10Mb 的 blob。
find / -size +10M -ls
这将找到大于 10MiB(不完全是 10MB)的文件。
这是一个很好的解释,应该会对您有所帮助。
https://askubuntu.com/a/36114
Github有一篇关于从存储库的所有已提交版本中删除特定文件的文章。