为什么我的Git仓库比工作目录大那么多?

8

我刚刚创建了一个新的代码库并提交了初始版本。

工作目录大小为2 GB。但是.git目录却有15 GB之大。

为什么只有一个提交的git代码库要比工作目录大近8倍?

我做错了什么吗?有没有办法解决这个问题?


2
尝试运行 git gc (运行 git gc --help 以查看其含义)。我没有将此作为答案发布,因为我不知道您的存储库为什么会如此庞大,但是 git gc 可能 有所帮助。 - Keith Thompson
这确实很奇怪。你可能是将一些文件添加到了暂存区,但在提交之前又将它们删除了吗? - Nayuki
你是如何创建这个新的代码库的?看起来你在那里存储了一些历史记录。重要提示:你使用了 git clone 还是 git init 呢? - Tim Biegeleisen
1
我正在从一个mercurial仓库创建它。我执行了以下操作:git init git add . git reset .hg,然后git commit -m "init" - PortMan
1
我尝试使用file://协议进行克隆,结果仓库只有2.8 GB。我猜测这可能是在提交之前添加到暂存区然后删除的所有文件。 - PortMan
请问您在Git Bash中键入git branch -a时看到了什么? - Tim Biegeleisen
1个回答

7
大型代码库的原因是您临时添加了“.hg”子目录的内容,但没有使用实际初始提交中的数据。让我们逐步追踪发生的情况:
1. "git init": 创建一个带有少量元数据的".git"子目录。
2. "git add .": 这将整个工作树复制到Git的索引(即暂存区)中 - 换句话说,包括项目中的所有文件,包括”.hg”目录中的所有文件。当我们说这些已经添加到索引时,这意味着所有文件内容都已添加到对象存储数据库中的“.git/objects”,并且“.git/index”文件指向所有文件。
3. "git reset .hg": 这将从索引中删除“.hg”子目录。但是已添加到存储中的对象不会被删除,因为其他提交或索引条目可能会指向它们。(Git目前不跟踪指向对象的引用数量。它使用跟踪垃圾收集,而不是引用计数。)
4. "git commit": 这是您执行的最后一个命令,将索引复制到新提交中,并将其存储到存储库中。
解决问题的方法:
- 如果您从空白存储库开始,并仅添加所需的文件,则可以在第一次避免文件膨胀,仔细排除“.hg”。 - 如果事后需要解决问题,则可以运行"git gc",希望未使用的对象被删除。

1
我最终采用的解决问题的方法是使用file://协议克隆存储库。 - PortMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接