3

在某个地方,一些巨大的文件被添加到我拥有的项目的 git 存储库中。当我在一台新机器上克隆这个项目时,该项目似乎在 37% 上“卡住”了很长一段时间。这个项目应该在几分钟内完成克隆。

我怎样才能找出导致这个冗长克隆时间的对象?

我知道如何“git rm”文件。即使它是一些只存在于历史中的旧对象,那会删除它吗?

我不太清楚,一旦你“git rm”一个文件,它是从存储库中完全删除,还是只是继续。

任何帮助都深表感谢!

4

3 回答 3

5

Pro Git对如何执行此操作有很好的分步说明。这需要一些工作,但可以可靠地完成。我不能将以下解释归功于 - 我只是从该网站窃取它(有关更详细的描述,请参阅原始网站):

  1. 打包你的回购:

    $ git gc
    
  2. 在 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
    
  3. 询问与最大 blob 关联的文件名:

    $ git rev-list --objects --all | grep 7a9eb2fb
    7a9eb2fba2b1811321254ac360970fc169ba2330 git.tbz2
    
  4. 获取该文件的历史记录:

    $ git log --pretty=oneline -- git.tbz2
    da3f30d019005479c99eb4c3406225613985a1db oops - removed large tarball
    6df764092f3e7c8f5f94cbe08ee5cf42e92a0289 added git tarball
    
  5. 用于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
    
  6. 清理一些对该 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)
    
于 2012-04-30T22:44:16.697 回答
2

您可以通过以下命令遍历提交树:

git ls-tree <first-commit-hash> -r --long > 1.txt

然后对大于 10Mb 的 blob 进行 grep 生成的文件。

于 2012-04-30T22:39:09.487 回答
1
find / -size +10M -ls

这将找到大于 10MiB(不完全是 10MB)的文件。

这是一个很好的解释,应该对您有所帮助。

https://askubuntu.com/a/36114

Github 有一篇很好的文章,关于从存储库的所有提交版本中删除特定文件。

于 2012-04-30T22:12:09.287 回答