在 git 存储库中移动大量大文件

Posted

技术标签:

【中文标题】在 git 存储库中移动大量大文件【英文标题】:Moving large number of large files in git repository 【发布时间】:2013-05-26 14:38:50 【问题描述】:

我的存储库有大量大文件。 它们主要是数据(文本)。 有时,由于重构或打包,我需要将这些文件移动到另一个位置。

我使用git mv命令来“重命名”文件的路径,但是提交的大小(实际差异大小)非常巨大,与rmgit add相同,这似乎效率低下/p>

还有其他方法可以减少提交大小吗? 还是我应该将它们添加到.gitignore 并作为 zip 文件上传到上游?


感谢您的回答。

仅供参考, 以下一系列命令将导致文件大小bar

git mv foo bar
git commit -m "modify"
git cat-file -s HEAD:bar

我认为 git 做了 rmadd。 你能告诉我这个信息是否与实际尺寸无关吗?

【问题讨论】:

“提交大小”是什么意思? 【参考方案1】:

按照设计,如果您在 Git 存储库中移动文件而不更改内容,则创建提交将仅存储新元数据(也称为树对象)以表示新文件位置。 由于内容不变,Git 不需要创建新的 blob 对象来存储文件内容。 所以“提交大小”应该相当小。

既然你说差异大小很大,我想一些文件内容随着重定位而被修改。这将是“提交大小”很大的原因。

在这两种情况下,您都可以尝试使用命令git gc --prune --aggressive 缩小 .git 目录大小

编辑:

git mv foo bar
git commit -m "modify"
git cat-file -s HEAD:bar

这些命令创建了一个新的提交,但是由于 foo/bar 文件内容没有改变,Git 不会存储任何新的东西,除了新的文件名。实际上,在您的示例中,重命名之前的git cat-file -s HEAD:foo 和之后的git cat-file -s HEAD:bar 会给您相同的结果,因为它的内容相同(.git/objects 中的相同 blob)。 我认为您误解了 git 在内部所做的事情。查看Git objets 以获得进一步的解释。

请记住,git 跟踪的是内容,而不是文件。

【讨论】:

【参考方案2】:

在 git 中移动内容不会改变存储库的大小。每个文件在存储库中只存储一次。如果您开始更改这些大文件,您只会增加存储库的大小。 - 然后每个新版本单独存储。

看看git-annex,也许这对你来说是正确的。

【讨论】:

以上是关于在 git 存储库中移动大量大文件的主要内容,如果未能解决你的问题,请参考以下文章

将子目录分离(移动)到单独的 Git 存储库中

如何将文件从一个文件夹移动到同一git存储库中的另一个文件夹保留历史记录[重复]

如何转换 git 存储库中的大量提交 [重复]

分离(移动)子目录到单独的 Git 存储库

在 Git 中导出带有历史记录的子树

Git:覆盖或擦除存储库中的大文件(档案)?