在 git 存储库中移动大量大文件
Posted
技术标签:
【中文标题】在 git 存储库中移动大量大文件【英文标题】:Moving large number of large files in git repository 【发布时间】:2013-05-26 14:38:50 【问题描述】:我的存储库有大量大文件。 它们主要是数据(文本)。 有时,由于重构或打包,我需要将这些文件移动到另一个位置。
我使用git mv
命令来“重命名”文件的路径,但是提交的大小(实际差异大小)非常巨大,与rm
,git add
相同,这似乎效率低下/p>
还有其他方法可以减少提交大小吗?
还是我应该将它们添加到.gitignore
并作为 zip 文件上传到上游?
感谢您的回答。
仅供参考,
以下一系列命令将导致文件大小bar
git mv foo bar
git commit -m "modify"
git cat-file -s HEAD:bar
我认为 git 做了 rm
和 add
。
你能告诉我这个信息是否与实际尺寸无关吗?
【问题讨论】:
“提交大小”是什么意思? 【参考方案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 存储库中移动大量大文件的主要内容,如果未能解决你的问题,请参考以下文章